我应该在Cassandra表中设置外键吗?

时间:2019-05-17 07:26:24

标签: cassandra data-modeling cassandra-3.0

我是Cassandra的新手,来自关系背景。我了解到Cassandra不支持JOIN,因此没有外键的概念。假设我有两个表:

用户

  • id
  • 名称

城市

  • id
  • 名称

在RDBMS世界中,我应该将city_id传递到users表中。由于没有联接的概念,并且允许您复制数据,因此在我可以创建表city_id的同时将users传递到users_by_cities表中是否仍然有效?

1 个答案:

答案 0 :(得分:2)

Cassandra的主要概念是根据查询设计表(因为对表的写入没有限制)。该设计基于查询过滤器。通过某些ID查询表的应用程序有点不自然,因为CITY_ID可以是任何值,并且通常是未知的(除非您运行了先前的查询来获取它)。更自然的可能是CITY_NAME。无论如何,假设表上没有索引(仅仅是表本身),Cassandra中有关于您提供的过滤器和表设计的规则,主要是至少要使过滤器之一成为分区键。分区键有助于将Cassandra定向到数据的正确节点(这是优化读取方式的方式)。如果您的过滤器都不是分区键,则会收到错误消息(除非您使用ALLOW FILTERING,这是禁止的)。其他过滤器(如果有的话)必须是聚类列(不能使用既不是分区键也不是聚类列的过滤器-再次使用,除非您使用ALLOW FILTERING)。

这些限制来自RDBMS领域,是不自然且难以调整的,并且由于这些限制,您可能必须将数据复制到非常相似的结构中(也许唯一的区别是分区键和集群列)。在大多数情况下,应由应用程序在发生更改时操纵每个结构,并且应用程序必须根据提供的过滤器知道要查询哪个表。所有这些都被认为是来自关系世界的痛苦(在关系世界中,您可以对一个结构做任何想做的事情)。这些“约束”需要权衡为什么您选择Cassandra作为存储引擎的原因。

希望这会有所帮助。

-吉姆