假设我有1000个具有完全相同结构的实体。例如,所有实体都有三个字段:
String id;
String name;
int amount;
此外,我预计系统中将存在大量的每种类型的实体。
所以我现在有两个变种:
为每个实体创建单独的表,如下所示:
CREATE TABLE <SOME_ENTITY_NAME> (
id text PRIMARY KEY,
name text,
amount int
)
我只创建一个表,但使用复合priamry键:
CREATE TABLE ALL_ENTITIES_TABLE (
entity_name text,
id text,
name text,
amount int,
PRIMARY KEY ((entity_name, id))
);
当然,只支持一个表更简单,但性能如何?
所以,问题是哪种变体在性能方面更好,考虑到每种类型的实体都会有数百万(可能是数十亿)的记录?
答案 0 :(得分:2)
在Cassandra集群中可以创建的表数量受到限制。通常的建议是将此数字保持在200以下,而〜500就像是“硬停止” ...
原因是每个表都需要分配额外的内存和其他资源来保存辅助数据,例如键/行缓存,bloom过滤器等。根据Cassandra版本,每个表可能需要1-2Mb的内存。
因此,在您的情况下,第二个设计更好,因为您将所有数据都保存在单个表中,并且分区键将允许在群集的节点之间平均分布数据。
答案 1 :(得分:0)
在我看来,第一种方法在可维护性方面是不正确的。应该很难维护太多动态创建的表。此外,如果您正确使用分区/群集顺序(根据数据检索的需要),查询应该更容易和有效。此外,如果您使用的是3.x版本的Cassandra,则二级索引可以派上用场。
注意:辅助索引不允许排序。
答案 2 :(得分:0)
Cassandra的设计围绕着磁盘空间是最便宜的资源。您必须围绕最常使用的查询构建数据模型,无论此模型是否会占用更多磁盘空间 - 只要它以最有效的方式满足您的查询目的。如果不查看您将要使用的查询,我将无法回答您的问题。通常,只要满足查询目的,您就可以随意创建所需数量的表。我建议看看here。