在RDB中的 A 和 B 之间有大的OneToMany关联(大约1 <-100万)。
详细而言, A 是 B 的持久性集合,由于某些永久性的商务流程,它应该会不断变化。可能会添加一些 B ,其他一些可能会被删除。重要的是有可能以可分页的方式选择 B 。
由于迁移数据存储到Apache Cassandra,考虑该关系的数据模型。
我想这个好的解决方案是将商店 A 作为行,其中列是 B 的标识。
列族A:
A->{
RowID1->{description="...", BId0="123", BId1="456", ..., BId1000000="987"},
RowID2->{description="...", BId0="123", BId1="456", ..., BId500000="888"},
...
}
这是一个好方法吗?如何实现呢?
答案 0 :(得分:2)
我想,从实现的简单性来看,这是一个很好的方法,但如果一个分区内有数百万个大行,那么对于集群内的性能和数据分布来说,这可能不是最佳的。
在CQL中,它可以像这样实现:
CREATE TABLE b_by_a ( a text, b text, description text, PRIMARY KEY (a, b) );
a 和 b 是从分区键 a 和群集键 b 复合的主键。要插入,选择并删除一些 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.