试图了解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向行添加新列?我想到的特定应用程序用例我只需要一个键标识符和任意列名,其中列名可能包含时间戳+ variable_identifier。
Cassandra是正确的工具吗?文档中的预定义列只是一个示例吗?如何使用现有列族/表添加动态列名?
答案 0 :(得分:5)
我是否必须使用ALTER TABLE使用CLQ向该行添加新列?
是的,必须先定义架构,然后才能插入“新列”。 但是,您可以定义1列作为数据集合。在混合动态和静态列下的数据共享'thrift to cql upgrade'博客中查看“标记”示例。
如何使用现有列族/表添加动态列名?
在CQL中,您必须首先使用ALTER
关键字更改表(列族)的结构。我的猜测是,这是为了确保列族包含指定的列,从而消除错误添加列的可能性(更好的数据质量)。
Cassandra是否是正确的工具?
我认为是,但是如果您需要在不指定架构更改语句的情况下即时添加列,那么您应该考虑基于thrift的API,这可以做到这一点,但只是一个友好的警告,datastax建议新的应用程序使用CQL。
答案 1 :(得分:1)
我在邮件列表中的答案:
对于卡桑德拉来说,Schemalessness根本不是一个有趣的概念。您可能会遭受过多的文档数据库暴露。经验表明,随着项目和团队的成长,使用模式说“电子邮件列是文本,出生日期列是时间戳”非常有用。
关系模型本身没有任何问题(根据需要对规范进行非规范化的通常解释)。 Cassandra的目的是让应用程序扩展,而不是为了与众不同而将SQL婴儿扔掉洗澡水。
也就是说,如果您真的不知道可能适用的属性类型(通常是因为它们是用户生成的),您可以使用Map。