我是Cassandra的新手。把头撞到墙上几天之后,事情开始变得有意义,除了.... 我总是需要PK来执行查询?
所以,我考虑了以下情况:让我们说我正在建立一个包含数千个食谱的食谱网站。每个食谱都有标题,成分列表和类型(早餐,午餐,甜点等) 我想有一个搜索字段,我可以使用这三个参数中的任何一个来查找配方。我不能将所有3个参数都设为PK,因为我无法使用 其中一个进行搜索[如果我有一个,则相同PK和其他人作为集群密钥]。 我知道二级索引并不是一个好主意。 所以,如果我想能够通过其成分查询食谱,我将不得不创建一个成分表,我在其中放入recipeId,然后是每行的成分列表,对吗?
但是,我如何按成分查询并按评级排序?我应该在配料表中添加评级吗?我应该复制那么多的数据吗?
如果我想按成分和类型查询,我需要执行两个单独的查询并进行比较?
对于users表:登录时我需要通过电子邮件找到用户。然后,其他用户将按其姓名搜索他们的朋友。所以我需要一个不同的表来登录凭据和用户档案?
基本上,我要做的是创建表格的批次。这是预期的吗?这是可取的吗?
我应该以某种方式注入MySQL和Cassandra吗?
提前致谢。
答案 0 :(得分:1)
Henrique - 你正在触及Cassandra(C *迄今为止)的许多最基本的概念。
1)分区密钥(当您引用PK时),无论是否复合,都决定 您的数据存储在C *集群中的位置。分区程序决定了如何将分区键的值转换为标记。集群中的每个节点都负责令牌范围的一部分。因此,当您想查询某些数据时,通过分区键查询,您实际上是在指示C *环中的哪个节点从中获取数据。
不要考虑使用字节顺序分区程序进行范围查询。看到这个答案。 Cassandra ByteOrderedPartitioner
2)按查询设计。 “Cassandra:权威指南:Web规模的分布式数据”一书中有一个关于数据建模的优秀部分。花时间阅读其中一本关于数据建模的C *书籍。
例如,您拥有订单和订单项的系统。注意:我不是主张将Cassandra用于订购系统,这只是一个易于理解的关系模型。
您的用户希望获得包含所有商品的订单,因此您可以构建一个类似于
的表格CREATE TABLE orders_to_items (o_id uuid, item_id uuid, PRIMARY KEY(o_id));
如果您还想查看已添加项目的所有订单,那么您需要/想要一个单独的表格;
CREATE TABLE items_on_orders (item_id uuid, o_id uuid, PRIMARY KEY(item_id));
因此,您可以看到这两个单独的查询,最终生成两个单独的表。
有趣的是,这里有几个快速的答案。
是 - 非规范化,非规范化。这就是C *的全部内容。
不要被物化视图诱惑:除非你真的了解它们,否则我的建议是避免。
3)对于您的搜索项目(按名称搜索),您可能需要在Cassandra之上考虑使用Lucene之类的其他工具来执行您所说的“搜索”。我在Cassandra的stratio Lucene插件中看到了一些很好的,真实的成功。
注意:我在AWS中运行9节点,3.11.2 C *集群。