Google BigQuery/Amazon Redshift 使用基于列的关系数据库还是 NoSQL 数据库?

Does Google BigQuery/ Amazon Redshift use column-based relational database or NoSQL database?

我仍然不太清楚基于列的关系数据库与基于列的非SQL 数据库之间的区别。

Google BigQuery 启用了类似 SQL 的查询,所以它怎么会是 NoSQL?

我知道的基于列的关系数据库有 InfoBright、Vertica 和 Sybase IQ。

基于列的没有SQL 我知道的数据库是Cassandra和HBase。

以下关于 Redshift 的文章以 "NoSQL" 开头,但以使用 PostgreSQL(关系)结尾: http://nosqlguide.com/column-store/intro-to-amazon-redshift-a-columnar-nosql-database/

这里要澄清的几件事主要是关于 Google BigQuery。

BigQuery 是一个混合 系统,允许您将数据存储在列中,但它通过附加功能进入 NoSQL 世界,例如 record 类型和 nested 功能。您还可以有一个 2Mbyte STRING 列,您可以在其中存储原始文档,如 JSON 文档。查看其他 data formats and limits 适用。您也可以在 Javascript 中编写用户定义的函数,例如:您可以粘贴到执行 NLP javascript 库的库中。

现在您拥有所有这些存储数据的能力,您可以使用 JSON Functions 例如查询存储在其中一列中的文档,因此这可以用作无模式存储,因为您没有没有为该列定义 JSON 文档结构,您只是将其存储为 JSON。明白了吗?

从元列查询的基本示例,这是一个 JSON 文档,原因键,并执行包含语言构造以找出该键中有多少用户 "unsubscribed"单词:

SELECT 
  SUM(IF(JSON_EXTRACT_SCALAR(meta,'$.reason') contains 'unsubscribed',1,0))  
FROM ...

另一方面,您有 table-wildcard querying。如果您的行跨越多个 table,则需要这样做。 Table 通配符函数是一种从特定的 table 集合中查询数据的经济高效的方法。当您使用 table 通配符函数时,BigQuery 只会访问与通配符匹配的 table 并向您收费。所以这意味着建议将数据存储在类似的 tables 中,只是在每个设定的时间范围内划分为不同的 tables,例如:每天,每月 tables.

我们不应该忘记 BigQuery 仅按设计追加,因此您无法更新旧记录,没有 UPDATE 语言构造更新:现在 DML language construct 可以执行一些 update/delete 操作)。相反,您需要附加一条新记录,并且您的查询必须以始终适用于最新版本数据的方式编写。如果您的系统是事件驱动的,那么这就非常简单,因为每个事件都将附加到 BQ 中。但是如果用户更新了它的个人资料,你需要再次存储个人资料,你不能更新旧行。您需要有一个列 version/date 来告诉您哪个是最新版本,您的查询将首先编写以获取行的最新版本然后处理逻辑。

您可以在该字段中使用类似 over/partition 的内容,并使用最新的值 seqnum=1

来自 profile 的 returns,每个 user_id 的最后一个 emailtimestamp 列的最新条目定义。

SELECT email
   FROM
     (SELECT email
             row_number() over (partition BY user_id
                                ORDER BY TIMESTAMP DESC) seqnum
      FROM [profile]
    )
   WHERE seqnum=1

首先,记住NOSQL通常被认为是"Not Only SQL"的缩写,所以系统同时拥有SQL接口和一些NOSQL 特征。 话虽如此,Redshift 和 BigQuery 的基础都是基于列的数据库。 Redshift 基于 Paraccel,它是针对数据仓库的经典的基于列的 RDBMS,而 BigQuery 基于内部 Google 的基于列的数据处理技术,称为 "dremel"。