我是Cassandra的新手,想开始尝试一个简单的测试
我们使用传统RDBMS的数据模型如下
表Company (Id,Name)
表Product ( ID,Name,Company ID),其中Company ID为FK,参照Company表
表ProductInstance (Id,ProductID),其中ProductID是对产品表的FK引用
表ProductInstanceRating (Id,ProductInstanceID,Comment),其中ProductInstanceID是对ProductInstance表的FK引用
对Cassandra的设计有什么建议吗?
更新:
我试着从查询的角度来看
要捕获的数据
1)产品引用是由产品名称、产品批号和客户ID组成的复合键产品名称: 12456产品批号: PQ23客户ID : 879456
则唯一的产品参考将类似于12456|PQ23|879456
2)产品实例将是上述产品的每个实例的唯一哈希号集合
并且该产品的每个实例将获得唯一的编号784A、876T等,并且该编号对于特定的产品参考将是唯一的
产品实例参考将类似于12456|PQ23|879456|784A
3)每个产品唯一编号可以获得1个以上的评级
在这种情况下,查询将如下所示
Query1)为了添加/插入产品实例的评级;获取产品的行,即12456|PQ23|879456
Query2)获取此行中的ProductInstance ID (可能是列族的名称)
Query3)将评级信息添加为列:值对
设计应该是这样的吗?
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}}
}此后,我们希望:
Query4)获取所有有实例的产品
Query5)获取所有具有评级的产品实例
Query6)获得产品的最高评级
Query7)获取产品的平均评级
有没有更好、更有效的方法来实现这一点?
发布于 2011-04-29 16:52:36
在Cassandra中,您需要考虑希望运行哪些查询(与RDBMS不同,在RDBMS中,您可以为域建立一个相当抽象的模型,然后设计SQL查询),因为您只能执行行键查找或使用相当有限的二级索引。任何其他索引都需要在列族中显式创建。
出于这个原因,去规范化是很常见的。然而,维护数据可能会更加困难,因为在Cassandra中没有级联删除等。
一种候选结构可能是使用ProductInstance列族来存储评级,然后使用product列族作为索引来查找给定产品的实例,最后使用company列族作为索引来查找特定公司的产品。或者,您可以将公司作为Product列系列中的一列进行非规范化处理。
重复一遍,只有当您知道您希望支持哪些查询时,才能确定您的“正确”结构。
https://stackoverflow.com/questions/5816135
复制相似问题