【问题标题】:How to understand the 'Flexible schema' in Cassandra?如何理解 Cassandra 中的“灵活模式”?
【发布时间】:2020-07-02 09:03:42
【问题描述】:

我是 Cassandra 的新手,可以在下面的维基百科中找到。

列族(自 CQL 3 起称为“表”)类似于 RDBMS(关系数据库管理系统)中的表。列族包含行和列。每一行都由一个行键唯一标识。每行有多个列,每列都有一个名称、值和时间戳。与 RDBMS 中的表不同,同一列族中的不同行不必共享同一组列,并且可以随时将列添加到一个或多个行中。[29]

上面说'同一列族中的不同行不必共享同一组列',但是如何实现呢?官网的文档我几乎都看完了。

我可以创建表格并插入如下数据。

CREATE TABLE Emp_record(E_id int PRIMARY KEY,E_score int,E_name text,E_city text);
INSERT INTO Emp_record(E_id, E_score, E_name, E_city) values (101, 85, 'ashish', 'Noida');
INSERT INTO Emp_record(E_id, E_score, E_name, E_city) values (102, 90, 'ankur', 'meerut');

这很像我在关系数据库中所做的。那么如何创建不同列的多行呢?

我也找到了官方文档中提到的'Flexible schema',这里怎么理解?

非常感谢。

【问题讨论】:

    标签: cassandra


    【解决方案1】:

    列族来自于 Cassandra 的原始设计,当时的数据模型类似于 Google BigTable 或 Apache HBase,并使用 Thrift 协议进行通信。但这需要在应用程序内部定义架构,这使得从许多应用程序访问数据更加成问题,因为您需要更新所有应用程序内部的架构......

    CREATE TABLEINSERT 是很久以前引入的 Cassandra 查询语言 (CQL) 的一部分,并取代了基于 Thrift 的实现(Cassandra 4.0 完全移除了对 Thrift 的支持)。在 CQL 中,您需要为表定义架构,您需要在其中提供列名和类型。如果你真的需要动态列,有几种方法(我会链接我已经写过的答案,所以不会重复):

    1. 如果你有相同类型的值,你可以使用一列作为属性/列的名称,另一列存储值,如described here
    2. 如果您有不同类型的值,您还可以使用一列作为属性/列的名称,并为值定义多列 - 每种数据类型各一列:inttext、.. .,并且您只将值插入到相应的列中(描述为here
    3. 您可以使用地图(描述为here) - 它类似于第一或第二,但主要设计用于非常少量的“动态列”,还有其他限制,例如,您需要阅读完整的地图才能获取一个值等)

    【讨论】:

    • 谢谢,还是不知道是不是实现了不同的行不同的列?
    • Cassandra 要求在插入期间只应指定主键 - 所有其他列都是可选的 - 如果您不指定值,您将返回 null。所以你可以这样做,insert into table (pk1, pk2, col1) values (1, 2, 3) 然后insert into table (pk1, pk2, col3) values (2, 3, 5),你会得到 2 行 - 首先你将只有在 col1 中的值,然后在第二个 - 只有在 col2
    猜你喜欢
    • 1970-01-01
    • 2015-08-01
    • 2014-08-19
    • 1970-01-01
    • 2010-09-16
    • 2022-01-23
    • 1970-01-01
    • 2013-01-17
    • 1970-01-01
    相关资源
    最近更新 更多