Cassandra数据模型 - 列族

cro*_*raf 0 database data-modeling cassandra nosql column-family

我在这里查了一些问题,比如理解Cassandra数据模型Column-family概念和数据模型,以及一些关于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'}
Run Code Online (Sandbox Code Playgroud)

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

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

Chr*_*ink 5

有点错的问题.不是围绕数据建模,而是围绕如何查询数据建模.你想读什么?您可以围绕该数据模型创建数据模型,因为存储对于如何访问数据非常严格.很可能id不是密钥,如果你想让作者或收件人读取你使用它作为分区键,使用唯一id(使用uuid not auto inc)作为聚类索引.即:

CREATE TABLE message_by_recipient (
  author text,
  recipient text,
  id timeuuid,
  data text,
  PRIMARY KEY (recipient, id)
) WITH CLUSTERING ORDER BY (id DESC)
Run Code Online (Sandbox Code Playgroud)

然后看到五个最新的电子邮件到"鲍勃"

select * from message_by_recipient where recipient = 'bob' limit 5
Run Code Online (Sandbox Code Playgroud)

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