在 Cassandra 中保持大型 OneToMany 关联的最佳方法是什么?
What is the best way to persist big OneToMany association in Cassandra?
在 RDB 中 A 和 B 之间有很大的 OneToMany 关联(大约 1 <- 100 万)。
详细来说,A是B的一个持久化集,应该会因为一些永久性的业务而不断发生轻微的变化-过程。 B有的可以加,有的可以删。以可分页的方式 select B 的可能性很重要。
由于将数据存储迁移到 Apache Cassandra,正在考虑该关系的数据模型。
我想好的解决方案是将 A 作为 行 存储,其中列是 的标识B.
列族 A:
A->{
RowID1->{description="...", BId0="123", BId1="456", ..., BId1000000="987"},
RowID2->{description="...", BId0="123", BId1="456", ..., BId500000="888"},
...
}
这样做好吗?如何实现?
我想,从实现的简单性角度来看,这是一种好方法,但如果一个分区内有数百万行,它对于集群内的性能和数据分布可能不是最佳的。
在CQL中可以这样实现:
CREATE TABLE b_by_a ( a text, b text, description text, PRIMARY KEY (a, b) );
其中 a 和 b 是由分区键 a 和集群键复合而成的主键b。要插入,select 和删除一些 b 你必须知道 a.
Insert INTO b_by_a (a, b, description) values ('value a', 'value b 1', '...');
Insert INTO b_by_a (a, b, description) values ('value a', 'value b 2', '...');
SELECT * FROM b_by_a WHERE a='value a';
Datastax cassandra 驱动程序提供 paging by query results
的能力
请注意一些 cassandra limitations:
The maximum number of cells (rows x columns) in a single partition is 2 billion.
在 RDB 中 A 和 B 之间有很大的 OneToMany 关联(大约 1 <- 100 万)。
详细来说,A是B的一个持久化集,应该会因为一些永久性的业务而不断发生轻微的变化-过程。 B有的可以加,有的可以删。以可分页的方式 select B 的可能性很重要。
由于将数据存储迁移到 Apache Cassandra,正在考虑该关系的数据模型。
我想好的解决方案是将 A 作为 行 存储,其中列是 的标识B.
列族 A:
A->{
RowID1->{description="...", BId0="123", BId1="456", ..., BId1000000="987"},
RowID2->{description="...", BId0="123", BId1="456", ..., BId500000="888"},
...
}
这样做好吗?如何实现?
我想,从实现的简单性角度来看,这是一种好方法,但如果一个分区内有数百万行,它对于集群内的性能和数据分布可能不是最佳的。
在CQL中可以这样实现:
CREATE TABLE b_by_a ( a text, b text, description text, PRIMARY KEY (a, b) );
其中 a 和 b 是由分区键 a 和集群键复合而成的主键b。要插入,select 和删除一些 b 你必须知道 a.
Insert INTO b_by_a (a, b, description) values ('value a', 'value b 1', '...');
Insert INTO b_by_a (a, b, description) values ('value a', 'value b 2', '...');
SELECT * FROM b_by_a WHERE a='value a';
Datastax cassandra 驱动程序提供 paging by query results
的能力请注意一些 cassandra limitations:
The maximum number of cells (rows x columns) in a single partition is 2 billion.