Cassandra数据模型 - 列族

时间:2018-01-17 13:13:49

标签: database cassandra nosql data-modeling column-family

我在这里查看了一些问题,例如Understanding Cassandra Data ModelColumn-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'}

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

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

1 个答案:

答案 0 :(得分:5)

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

$result = array_merge($array, $array["meta"]);
unset($result["meta"]);
var_dump($result);

然后查看五个最新的电子邮件到" bob"

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

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