我是Cassandra的新手,来自关系背景。我了解到Cassandra不支持JOIN,因此没有外键的概念。假设我有两个表:
用户
城市
在RDBMS世界中,我应该将city_id
传递到users
表中。由于没有联接的概念,并且允许您复制数据,因此在我可以创建表city_id
的同时将users
传递到users_by_cities
表中是否仍然有效?
答案 0 :(得分:2)
Cassandra的主要概念是根据查询设计表(因为对表的写入没有限制)。该设计基于查询过滤器。通过某些ID查询表的应用程序有点不自然,因为CITY_ID可以是任何值,并且通常是未知的(除非您运行了先前的查询来获取它)。更自然的可能是CITY_NAME。无论如何,假设表上没有索引(仅仅是表本身),Cassandra中有关于您提供的过滤器和表设计的规则,主要是至少要使过滤器之一成为分区键。分区键有助于将Cassandra定向到数据的正确节点(这是优化读取方式的方式)。如果您的过滤器都不是分区键,则会收到错误消息(除非您使用ALLOW FILTERING,这是禁止的)。其他过滤器(如果有的话)必须是聚类列(不能使用既不是分区键也不是聚类列的过滤器-再次使用,除非您使用ALLOW FILTERING)。
这些限制来自RDBMS领域,是不自然且难以调整的,并且由于这些限制,您可能必须将数据复制到非常相似的结构中(也许唯一的区别是分区键和集群列)。在大多数情况下,应由应用程序在发生更改时操纵每个结构,并且应用程序必须根据提供的过滤器知道要查询哪个表。所有这些都被认为是来自关系世界的痛苦(在关系世界中,您可以对一个结构做任何想做的事情)。这些“约束”需要权衡为什么您选择Cassandra作为存储引擎的原因。
希望这会有所帮助。
-吉姆