几天前,我读到了 NoSQL 的宽列存储类型和专门的 Apache-Cassandra。
我的理解是 Cassandra 包括:
一个键空间(如关系数据库中的数据库)并支持许多列族或表(与关系数据库中的表相同)和无限行。
来自 Stackoverflow 标签:
宽列存储是一种键值对数据库。它使用表、行和列,但与关系数据库不同,列的名称和格式在同一个表中的行与行之间可能会有所不同。
在 Cassandra 中,所有行(在表中)都应该有一个行键,然后每个行键可以有多个列。我读到了关系数据库和 NoSQL (Cassandra) 在实现和存储数据方面的差异。
但我不明白结构之间的区别:
想象一下我有一个表(或 Cassandra 中的列族)的场景:
当我执行这样的查询(CQL)时:
select * from users;
如您所见,它给了我结果:
lastname | age | city | email
----------+------+---------------+----------------------
Doe | 36 | Beverly Hills | janedoe@email.com
Jones | 35 | Austin | bob@example.com
Byrne | 24 | San Diego | robbyrne@email.com
Smith | 46 | Sacramento | null
Jones2 | null | Austin | bob@example.com
因此,我使用以下查询在关系数据库(MS SQL)中执行上述场景:
select * from [users]
结果是:
lastname | age | city | email
----------+------+---------------+----------------------
Doe | 36 | Beverly Hills | janedoe@email.com
Jones | 35 | Austin | bob@example.com
Byrne | 24 | San Diego | robbyrne@email.com
Smith | 46 | Sacramento | NULL
Jones2 | NULL | Austin | bob@example.com
我知道 Cassandra 支持动态列,我可以通过以下方式执行此操作:
ALTER TABLE users ADD website varchar;
但它在关系模型中可用,例如在 mssql 中,上面的代码也可以实现。就像是:
ALTER TABLE users ADD website varchar(MAX);
我看到的是第一次选择和第二次选择结果是一样的。在 Cassandra 中,他们只是将行键(姓氏)作为独立对象提供,但它与 mssql(以及所有关系数据库)中的唯一字段(如 ID 或文本)相同,我看到 Cassandra 中的列类型是静态的(在我的例子中varchar
)不像它在 Stackoverflow 标签中描述的那样。
所以我的问题是:
我对卡桑德拉的想象有什么误解吗?!
那么两种结构有什么不同呢?!我告诉你结果是一样的。
是否有任何特殊场景(类似 JSON)无法在关系数据库中实现但 Cassandra 支持?(例如,我知道 Cassandra 不支持嵌套列。)
感谢您的阅读。