3

在尝试了解 Cassandra 的一些基础知识时,我的印象是开发人员在设计数据模型时可以利用的优势之一是通过动态地将列添加到由键标识的行中。这意味着我可以对我的数据进行建模,以便在有意义的情况下,键可以是关系数据库中的 user_id 之类的东西,例如,我可以创建与该用户相关的任意数量的列。

我不明白为什么在 CLQ 示例中如此强调预定义列,特别是在 CREATE TABLE/COLUMNFAMILY 示例中:

CREATE TABLE emp (
  empID int,
  deptID int,
  first_name varchar,
  last_name varchar,
  PRIMARY KEY (empID, deptID)
);

这种类型的模型将内容放入关系数据库不是更有意义吗?如果我直到运行时才知道我的列名并且需要动态创建它怎么办?我是否必须使用 ALTER TABLE 向使用 CLQ 的行添加新列?我想到的特定应用程序用例只需要一个键标识符和任意列名,其中列名可能包含时间戳+变量标识符。

Cassandra 是不是合适的工具?文档中的预定义列仅仅是一个示例吗?如何在现有列族/表中添加动态列名?

4

2 回答 2

5

我是否必须使用 ALTER TABLE 向使用 CLQ 的行添加新列?

是的,必须先定义架构,然后才能插入“新列”。但是,您可以定义 1 列作为数据集合。查看 datastax 的“thrift to cql upgrade”博客中混合动态和静态列下的“标签”示例。

如何在现有列族/表中添加动态列名?

在 CQL 中,您必须首先使用ALTER关键字更改表(列族)的结构。我的猜测是,这是为了确保列族包含指定的列,从而消除错误添加列的可能性(更好的数据质量)。

Cassandra 是不是合适的工具?

我认为是的,但是如果您需要在不指定模式更改语句的情况下即时添加列,那么您可能应该研究可以做到这一点的基于节俭的 API,但只是一个友好的警告,datastax 建议新应用程序使用 CQL。

于 2013-05-27T08:26:42.860 回答
1

我在邮件列表中的回答:

对于 Cassandra 来说,无模式根本不是一个基本概念。您可能因过多接触文档数据库而受苦。经验表明,随着项目和团队的发展,使用模式来表示“电子邮件列是文本,出生日期列是时间戳”非常有用。

关系模型本身没有问题(根据通常的解释需要非规范化以进行缩放)。Cassandra 是关于使应用程序规模化,而不是为了与众不同而将 SQL 婴儿与洗澡水一起扔掉。

也就是说,如果您真的不知道可能应用哪些类型的属性(通常是因为它们是用户生成的),您可以使用 Map。

于 2013-05-27T19:51:56.663 回答