Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/cassandra/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Database design 产品ID管理的Cassandra设计_Database Design_Cassandra - Fatal编程技术网

Database design 产品ID管理的Cassandra设计

Database design 产品ID管理的Cassandra设计,database-design,cassandra,Database Design,Cassandra,我刚接触卡桑德拉,想开始尝试一个简单的测试 我们与传统关系型数据库的数据模型如下 表公司(Id、名称) 表产品(Id、名称、公司Id),其中公司Id是对公司表的FK引用 表ProductInstance(Id,ProductID),其中ProductID是对产品表的FK引用 表ProductInstanceRating(Id、ProductInstanceID、Comment),其中ProductInstanceID是对ProductInstance表的FK引用 对卡桑德拉的设计有什么建议吗 更

我刚接触卡桑德拉,想开始尝试一个简单的测试

我们与传统关系型数据库的数据模型如下

表公司(Id、名称)

表产品(Id、名称、公司Id),其中公司Id是对公司表的FK引用

表ProductInstance(Id,ProductID),其中ProductID是对产品表的FK引用

表ProductInstanceRating(Id、ProductInstanceID、Comment),其中ProductInstanceID是对ProductInstance表的FK引用

对卡桑德拉的设计有什么建议吗

更新: 我试着从怀疑的角度看问题

要捕获的数据

1) Product Reference是一个复合键,包含:产品名称、产品批号和客户ID 产品名称:12456 产品批号:PQ23 客户编号:879456

然后,唯一的产品参考将类似于12456 | PQ23 | 879456

2) 产品实例将是上述产品的每个实例的唯一哈希数集

产品的每个实例都将获得一个唯一的编号 784A、876T等,该编号对于特定产品参考是唯一的

产品实例引用类似于12456 | PQ23 | 879456 | 784A

3) 每个产品唯一编号可获得1个以上评级

在这种情况下,查询将类似于

12456|PQ23|879456 {
      784A{timestamp1:{rating:valueA
                      person name:valueX}
           timestamp2:{rating:valueB
                      person name:valueY}}

      876T{timestamp1:{rating:valueC
                      person name:valueX}
           timestamp2:{rating:valueB
                      person name:valueY}}
}
查询1)以添加/插入产品实例的评级; 获取产品行,即12456 | PQ23 | 879456

查询2)获取此行中的ProductInstance ID(可能是列族的名称)

查询3)将评级信息添加为列:值对

设计应该是这样的吗

12456|PQ23|879456 {
      784A{timestamp1:{rating:valueA
                      person name:valueX}
           timestamp2:{rating:valueB
                      person name:valueY}}

      876T{timestamp1:{rating:valueC
                      person name:valueX}
           timestamp2:{rating:valueB
                      person name:valueY}}
}
此后,我们希望:

查询4)获取具有实例的所有产品
查询5)获取所有具有评级的产品实例
查询6)获取产品的最高评级
查询7)获取产品的平均评级


有没有更好、更有效的方法来实现这一点?

在Cassandra中,您需要考虑希望运行什么查询(不像RDBMS,在RDBMS中,您可以对域建立一个相当抽象的模型,然后设计SQL查询),因为您只能进行行键查找或使用相当有限的二级索引。任何其他索引都需要在列族中显式创建

因此,反规范化是常见的。然而,维护数据可能会更加困难,因为Cassandra中没有级联删除等

一种候选结构可能是使用ProductInstance columnfamily存储评级,然后使用Product columnfamily作为索引查找给定产品的实例,然后使用Company columnfamily作为索引查找特定公司的产品。或者,您可以将公司反规范化,并将其作为产品columnfamily中的一列

重复一下,只有当您知道希望支持哪些查询时,才能确定您的“正确”结构