0

我在这里查看了一些问题,例如Understanding Cassandra Data Model and Column-family concept and data model,以及一些关于 Cassandra 的文章,但我仍然不清楚它的数据模型是什么。

Cassandra 遵循列族数据模型,类似于键值数据模型。在列族中,您有行和列中的数据,所以二维结构,除此之外,您还有列族中的分组?我想这是按列族组织的,以便能够跨多个节点对数据库进行分区?

行和列如何分组到列族中?为什么我们有列族?

例如,假设我们有消息数据库,作为行:

id: 123, message: {author: 'A', recipient: 'X', text: 'asd'}
id: 124, message: {author: 'B', recipient: 'X', text: 'asdf'}
id: 125, message: {author: 'C', recipient: 'Y', text: 'a'}

我们如何以及为什么要围绕列族数据模型来组织它?

注意:如有必要,请更正或扩展示例。

4

1 回答 1

5

有点错误的问题。不是围绕数据建模,而是围绕您将如何查询数据进行建模。你想读什么?您可以围绕它创建数据模型,因为存储对访问数据的方式非常严格。很可能 id 不是键,如果您希望作者或收件人在读取时使用它作为分区键,并使用唯一 id(使用 uuid 而不是 auto inc)作为集群索引。IE:

CREATE TABLE message_by_recipient (
  author text,
  recipient text,
  id timeuuid,
  data text,
  PRIMARY KEY (recipient, id)
) WITH CLUSTERING ORDER BY (id DESC)

然后查看发给“bob”的五封最新电子邮件

select * from message_by_recipient where recipient = 'bob' limit 5

将 timeuuid 用于 id 将保证唯一性,而不会出现自动增量瓶颈,并且还提供按时间排序。您可以在新消息上重复写入,写入多个表,因此每次读取都是一次查找。如果data可以变大,可能希望用 uuid(类型 4)替换它并将其存储在由它键入的 blob 存储或分布式文件系统(即 s3)中。它将减少对 C* 的影响,并降低非规范化的成本。

于 2018-01-17T16:38:53.927 回答