保持非规范化 NoSql 数据库 (Cassandra/ScyllaDb) 表中的数据同步?

问题描述 投票:0回答:1

我是 Cassandra/ScyllaDb 等 NoSql 数据库的新手,并试图了解 NoSql 数据库表设计以及如何保持多个表中的重复数据同步。我刚刚阅读了这篇文章Apache Cassandra 中的数据模型,这里是该文章的重要屏幕截图。

申请流程

enter image description here

切博特科图

enter image description here

我有一些关于表设计和同步多个表中的重复数据的问题。

  1. 有用户和视频的表格。为什么没有评论表,因为它也是一个实体。

  2. 如果用户要向视频添加评论,我认为必须有两个插入语句。一个插入用于

    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() 将生成不同的值。

  3. 如果应该有一个

    comments
    表,那么如果用户想要添加注释,那么应该有三个插入语句。对
    comments
    表的第一个插入语句和返回的
    comment id
    将用于插入到
    comments_by_user
    comments_by_video

database cassandra nosql cassandra-3.0 scylla
1个回答
0
投票

免责声明:我没有只使用过 Cassandra 和 ScyllaDB,但由于后者被设计为前者的替代品,因此应应用相同的设计原则。

既然它也是一个实体,为什么没有任何评论表。

您不针对实体设计模式/表结构,而是针对将要执行的查询来设计它。它称为“查询优先数据模型”(在“ScyllaDB 文档”中)。它允许您根据将针对数据库执行的实际查询来优化数据结构。 由于没有要求(以及相应的查询)返回“任何”评论,而只返回每个视频和每个用户的评论(并且由于评论本身通常预计相对较小),因此您不需要专用评论表。

如何确保两个表中的

commentId

相同?例如,您是否将
timeuuid

分配给变量,然后在

commentId
槽中使用该变量来执行两个插入语句?

基本上是的,使用像
timeuuid

/
Guid

/至少某些版本的

uuid
这样的数据类型允许您在客户端以非常非常非常小的(小到您可以忽略它)机会生成它们碰撞(来自文档:
timeuuid
-版本 1 UUID,通常用作“无冲突”时间戳请参阅
使用 UUID 了解详细信息
如果应该有一个评论表,那么如果用户想要添加评论,那么应该有三个插入语句。

这要看情况。首先,如前所述 - 在所描述的场景中不需要这样的表。但如果您需要查询评论(不是通过用户/视频),那么这实际上取决于。如果您仍然可以认为注释很小 - 那么是的,您可以将注释放置在三个表中,如果由于某种原因注释被认为是“大”,那么数据重复的成本可能会变得太大,您可能只想将其存储在“实体”表(那么您将需要 2 个查询而不是一个来获取所需的数据)。

最新问题
© www.soinside.com 2019 - 2025. All rights reserved.