我是 Cassandra/ScyllaDb 等 NoSql 数据库的新手,并试图了解 NoSql 数据库表设计以及如何保持多个表中的重复数据同步。我刚刚阅读了这篇文章Apache Cassandra 中的数据模型,这里是该文章的重要屏幕截图。
申请流程
切博特科图
我有一些关于表设计和同步多个表中的重复数据的问题。
有用户和视频的表格。为什么没有评论表,因为它也是一个实体。
如果用户要向视频添加评论,我认为必须有两个插入语句。一个插入用于
comments_by_user
表,另一个插入用于 comments_by_video
表,并且两个表的 commentId
值必须相同。 如何确保两个表中的commentId
相同?例如,您是否将 timeuuid
分配给变量,然后在 commentId
槽中使用该变量来执行两个插入语句?
示例:
var myuuid = timeuuid();
insert into comments_by_user(...)values(..., myuuid);
insert into comments_by_video(...) values(...,myuuid);
我问这个问题的原因是,如果用户在两个插入语句中使用例如 timeuuid() 函数,那么两个表中的 commentid 的 timeuuid 将不相同,因为 timeuuid() 将生成不同的值。
如果应该有一个
comments
表,那么如果用户想要添加注释,那么应该有三个插入语句。对 comments
表的第一个插入语句和返回的 comment id
将用于插入到 comments_by_user
和 comments_by_video
。
免责声明:我没有只使用过 Cassandra 和 ScyllaDB,但由于后者被设计为前者的替代品,因此应应用相同的设计原则。
既然它也是一个实体,为什么没有任何评论表。
您不针对实体设计模式/表结构,而是针对将要执行的查询来设计它。它称为“查询优先数据模型”(在“ScyllaDB 文档”中)。它允许您根据将针对数据库执行的实际查询来优化数据结构。 由于没有要求(以及相应的查询)返回“任何”评论,而只返回每个视频和每个用户的评论(并且由于评论本身通常预计相对较小),因此您不需要专用评论表。
如何确保两个表中的commentId
timeuuid
分配给变量,然后在
槽中使用该变量来执行两个插入语句?commentId
基本上是的,使用像timeuuid
/
Guid
/至少某些版本的
uuid
这样的数据类型允许您在客户端以非常非常非常小的(小到您可以忽略它)机会生成它们碰撞(来自文档:”
timeuuid
-版本 1 UUID,通常用作“无冲突”时间戳请参阅使用 UUID 了解详细信息“
)如果应该有一个评论表,那么如果用户想要添加评论,那么应该有三个插入语句。
这要看情况。首先,如前所述 - 在所描述的场景中不需要这样的表。但如果您需要查询评论(不是通过用户/视频),那么这实际上取决于。如果您仍然可以认为注释很小 - 那么是的,您可以将注释放置在三个表中,如果由于某种原因注释被认为是“大”,那么数据重复的成本可能会变得太大,您可能只想将其存储在“实体”表(那么您将需要 2 个查询而不是一个来获取所需的数据)。