我在这里查看了一些问题,例如Understanding Cassandra Data Model和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'}
我们如何以及为什么围绕列族数据模型组织这个?
注意:如有必要,请更正或扩展示例。
答案 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 *的影响,并降低非规范化的成本。