Database design 产品ID管理的Cassandra设计
我刚接触卡桑德拉,想开始尝试一个简单的测试 我们与传统关系型数据库的数据模型如下 表公司(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个以上评级 在这种情况下,查询将类似于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引用 对卡桑德拉的设计有什么建议吗 更
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中的一列 重复一下,只有当您知道希望支持哪些查询时,才能确定您的“正确”结构