【问题标题】:Few-to-many modeling in Cassandra or other nosql dbCassandra 或其他 nosql 数据库中的少对多建模
【发布时间】:2019-10-22 09:55:42
【问题描述】:

我正在学习 NoSql,并使用 Cassandra。在我的测试数据集中,我有一些问题,每个问题都可能引用一个或多个主题(一个轻量级的 Quora 克隆,其关系模型如下所示)。

例如,关于 C++ 内存管理的问题,可能会参考“C++ 编程”、“软件工程”和“位和字节”等主题。我需要一个支持查询的模型,该查询返回引用特定主题的所有问题。一个简单的模型可能有这样的表:

ReferencesTopic: name="<topic>", value=”{questionId[]}”

然后,对任何主题的查找都会返回一个 JSON blob,其中包含一个 questionId 列表,用于引用该主题的问题。但是,这是一种“多对少”的关系(可能有 200 个主题,每个主题有数百万个 questionId),因此看起来效率很低。

我的想法是对给定主题的 HasTopics 进行分段,每个分段可能有 1000 个 questionId。这将有两个表:

TopicSegments:           name="<topic>", value="{topicSegmentId[]}"
ReferencesTopicSegment:  name=<topicSegmentId>, value="{questionId[]}"

这样做的好处是能够轻松查询给定主题的最近 n 个问题,因为最近的 topicSegmentId 位于 topicSegmentId 列表的底部。

这是一个合理的模型吗?

【问题讨论】:

    标签: cassandra nosql


    【解决方案1】:

    欢迎来到卡桑德拉。当您有使用关系数据库的经验时,您会遇到最常见的挑战,因为这种模型经常被尝试应用于 Cassandra。

    • Cassandra 没有联接或外键关系,如 RDBMS。
    • 架构的设计应基于您将如何进行查询。
    • 非规范化是必须的,Cassandra 可以有重复的数据。

    有多种在线资源可帮助您了解这种新范式,例如 rules of data modeling、DS201 in Datastax Academy,对于您使用 cmets 处理的示例,您还应该查看 The Last Pickle regarding Time Series 的这篇帖子

    【讨论】:

    • 谢谢。我认为还需要一个数据点(双关语)来结束这一点。使用 Cassandra,每个查询模式应该大约有一个表,因此我提出的 ReferencesTopic 表是该查询的合理模型。将表格划分为若干个问题,将数百万个问题解决为一个主题关注点。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-05-03
    • 1970-01-01
    • 2015-03-09
    • 1970-01-01
    • 1970-01-01
    • 2021-05-17
    相关资源
    最近更新 更多