Cassandra CQL - NoSQL 或 SQL

Posted

技术标签:

【中文标题】Cassandra CQL - NoSQL 或 SQL【英文标题】:Cassandra CQL - NoSQL or SQL 【发布时间】:2012-06-22 10:34:09 【问题描述】:

我对 Cassandra 还是很陌生,一周前才开始学习 Cassandra。 我第一次读到,它是一个 NoSQL,但是当我开始使用 CQL 时, 我开始怀疑 Cassandra 是 NoSQL 还是 SQL DB?

有人能解释一下为什么 CQL 或多或少像 SQL 吗?

【问题讨论】:

可以帮助一些语法,列出键空间的总数,列族在 ... 像显示数据库;显示表格; 在我的回答中给出了解决方案 【参考方案1】:

CQL 像 SQL 一样是声明性的,并且该语言的查询组件的非常基本的结构(选择条件的事物)是相同的。但是有足够的差异,人们不应该以与传统 SQL 相同的方式使用它。

显而易见的项目: 1. 没有连接或子查询。 2. 没有交易

不太明显但同样重要的注意事项:

    除主键外,如果您已在该列上创建了索引,则只能对该列应用 WHERE 条件。在 SQL 中,您不必为列建立索引以对其进行过滤,但在 CQL 中,select 语句将彻底失败。 没有 OR 或 NOT 逻辑运算符,只有 AND。对数据进行建模非常重要,因此您不需要这两个;很容易不小心忘记。 日期处理完全不同。 CQL 只允许对时间戳使用相等运算符,所以像这样极其常见和有用的表达式不起作用:where dateField > TO_TIMESTAMP('2013-01-01','YYYY-MM-DD') 此外,CQL 不允许字符串插入精确到毫秒(仅秒)的日期——但它确实允许输入毫秒,因为epoch 作为一个 long int - 大多数其他数据库引擎都不允许这样做。最后,对于没有时区的长毫秒和字符串格式,时区(作为 GMT 偏移量)是不可见的。对于那些故意不将本地时间 + GMT 偏移量混为一谈的系统,这可能会导致混淆。 您只能根据主键(或主键的 IN 列表)更新表。不能基于其他列数据进行更新,也不能像这样进行批量更新:update table set field = value; CQL 要求使用带有主键的 where 子句。 AND 的语法不允许使用括号。公平地说,由于缺少 OR 运算符,这不是必需的,但这意味着在表达式周围添加“保护性”括号的传统 SQL 重写器不适用于 CQL,例如:select * from www where (str1 = 'foo2') and (dat1 = 12312442);

一般来说,最好将 Cassandra 用作一个大的、有弹性的数据永久存储,可以应用少量非常高级、非常高性能的查询来拖出数据子集以供应用程序使用层。该子集可能是 100 万行,是的。 CQL 和 Cassandra 模型不适用于包含嵌入案例、聚合等的 2 页长 SELECT 语句。

【讨论】:

现在可以在 CQL3 中处理日期,只要您将时间戳作为复合键的一部分。这个例子解释它:datastax.com/dev/blog/whats-new-in-cql-3-0 #3 现在可以在 Casandra 版本 3 及更多版本中使用【参考方案2】:

出于所有意图和目的,CQL SQL,因此在最严格的意义上,Cassandra 一个 SQL 数据库。但是,大多数人将 SQL 与它通常应用于的relational databases 紧密联系在一起。根据这种(错误)解释,Cassandra 不应被视为“SQL 数据库”,因为它不是关系型的,并且不支持 ACID 属性。

【讨论】:

是的,但仅限于最低限度的方式;请参阅下面的答案。【参考方案3】:

Docs for CQLV3.0

CQL DESCRIBE 获取keyspacecolumn familycluster 的架构

CQL 不支持我在 SQL 中知道的一些东西,例如 joins group by triggers cursors procedure transactions stored procedures

CQL3.0 支持ORDER BY

CQL 支持所有 DML 和 DDL 功能

CQL 支持BATCH

BATCH is not an analogue for SQL ACID transactions.

只是上面提到的 DOC 是最好的参考 :)

【讨论】:

以上是关于Cassandra CQL - NoSQL 或 SQL的主要内容,如果未能解决你的问题,请参考以下文章

使用 CQL3 在 Cassandra 中进行数据版本控制

CQL Cassandra - 如何在插入或更新中使用 SELECT 结果

Cassandra CQL 3.2.1 清除列数据

CQL3 (Cassandra) upsert 增加一个计数器

Cassandra 中的列表大小

Cassandra Cql 范围选择