什么是宽列存储?
What exactly is a wide column store?
谷歌搜索定义 returns 得到面向列的数据库或给出非常模糊的定义。
我的理解是,宽列存储由列族组成,列族由行和列组成。所述家族中的每一行都一起存储在磁盘上。这听起来像是面向行的数据库存储数据的方式。这就引出了我的第一个问题:
宽列存储与常规关系数据库有何不同table?我是这样看的:
* column family -> table
* column family column -> table column
* column family row -> table row
这张来自 Database Internals 的图片看起来就像两个普通的 tables:
我对不同之处的猜测来自 "multi-dimensional map" 与宽列存储一起提到的事实。所以这是我的第二个问题:
宽列存储是从左到右排序的吗?意思是,在上面的例子中,行是先按Row Key
排序,然后再按[=12=排序吗? ],最后由 Qualifier
?
让我们从宽列数据库的definition开始。
Its architecture uses (a) persistent, sparse matrix, multi-dimensional
mapping (row-value, column-value, and timestamp) in a tabular format
meant for massive scalability (over and above the petabyte scale).
关系数据库旨在维护实体与描述实体的列之间的关系。一个很好的例子是客户 table。这些列包含描述客户姓名、地址和联系信息的值。所有这些信息对于每个客户都是相同的。
宽列数据库是 NoSQL 数据库的一种。
也许这是四宽列数据库的更好形象。
我的理解是,顶部的第一个图像,Column 模型,就是我们所说的 entity/attribute/value table。它是特定实体(列)中的 attribute/value table。
对于客户信息,第一个广域数据库示例可能如下所示。
Customer ID Attribute Value
----------- --------- ---------------
100001 name John Smith
100001 address 1 10 Victory Lane
100001 address 3 Pittsburgh, PA 15120
是的,我们可以为关系数据库建模。 attribute/value table 的力量来自更不寻常的属性。
Customer ID Attribute Value
----------- --------- ---------------
100001 fav color blue
100001 fav shirt golf shirt
营销人员可以想到的任何属性都可以被捕获并存储在 attribute/value table 中。不同的客户可以有不同的属性。
超级列模型以不同的格式保存相同的信息。
Customer ID: 100001
Attribute Value
--------- --------------
fav color blue
fav shirt golf shirt
您可以拥有与实体一样多的超级柱模型。它们可以在单独的 NoSQL table 中,也可以放在一起作为超级列系列。
Column Family 和 Super Column family 只是简单地给图片中的前两个模型一个 row id,以便更快地检索信息。
大多数(如果不是全部)宽列存储确实是面向行的存储,因为记录的每个部分都存储在一起。您可以将其视为二维键值存储。密钥的第一部分用于跨服务器分发数据,密钥的第二部分让您快速找到目标服务器上的数据。
宽栏商店将具有不同的功能和行为。但是,例如,Apache Cassandra 允许您定义数据的排序方式。以此table为例:
| id | country | timestamp | message |
|----+---------+------------+---------|
| 1 | US | 2020-10-01 | "a..." |
| 1 | JP | 2020-11-01 | "b..." |
| 1 | US | 2020-09-01 | "c..." |
| 2 | CA | 2020-10-01 | "d..." |
| 2 | CA | 2019-10-01 | "e..." |
| 2 | CA | 2020-11-01 | "f..." |
| 3 | GB | 2020-09-01 | "g..." |
| 3 | GB | 2020-09-02 | "h..." |
|----+---------+------------+---------|
如果您的分区键是 (id)
并且您的集群键是 (country, timestamp)
,则数据将这样存储:
[Key 1]
1:JP,2020-11-01,"b..." | 1:US,2020-09-01,"c..." | 1:US,2020-10-01,"a..."
[Key2]
2:CA,2019-10-01,"e..." | 2:CA,2020-10-01,"d..." | 2:CA,2020-11-01,"f..."
[Key3]
3:GB,2020-09-01,"g..." | 3:GB,2020-09-02,"h..."
或table形式:
| id | country | timestamp | message |
|----+---------+------------+---------|
| 1 | JP | 2020-11-01 | "b..." |
| 1 | US | 2020-09-01 | "c..." |
| 1 | US | 2020-10-01 | "a..." |
| 2 | CA | 2019-10-01 | "e..." |
| 2 | CA | 2020-10-01 | "d..." |
| 2 | CA | 2020-11-01 | "f..." |
| 3 | GB | 2020-09-01 | "g..." |
| 3 | GB | 2020-09-02 | "h..." |
|----+---------+------------+---------|
如果将主键(分区键和聚簇键的组合)改为(id, timestamp) WITH CLUSTERING ORDER BY (timestamp DESC)
(id为分区键,timestamp为聚簇键,降序排列),结果为:
[Key 1]
1:US,2020-09-01,"c..." | 1:US,2020-10-01,"a..." | 1:JP,2020-11-01,"b..."
[Key2]
2:CA,2019-10-01,"e..." | 2:CA,2020-10-01,"d..." | 2:CA,2020-11-01,"f..."
[Key3]
3:GB,2020-09-01,"g..." | 3:GB,2020-09-02,"h..."
或table形式:
| id | country | timestamp | message |
|----+---------+------------+---------|
| 1 | US | 2020-09-01 | "c..." |
| 1 | US | 2020-10-01 | "a..." |
| 1 | JP | 2020-11-01 | "b..." |
| 2 | CA | 2019-10-01 | "e..." |
| 2 | CA | 2020-10-01 | "d..." |
| 2 | CA | 2020-11-01 | "f..." |
| 3 | GB | 2020-09-01 | "g..." |
| 3 | GB | 2020-09-02 | "h..." |
|----+---------+------------+---------|
谷歌搜索定义 returns 得到面向列的数据库或给出非常模糊的定义。
我的理解是,宽列存储由列族组成,列族由行和列组成。所述家族中的每一行都一起存储在磁盘上。这听起来像是面向行的数据库存储数据的方式。这就引出了我的第一个问题:
宽列存储与常规关系数据库有何不同table?我是这样看的:
* column family -> table
* column family column -> table column
* column family row -> table row
这张来自 Database Internals 的图片看起来就像两个普通的 tables:
我对不同之处的猜测来自 "multi-dimensional map" 与宽列存储一起提到的事实。所以这是我的第二个问题:
宽列存储是从左到右排序的吗?意思是,在上面的例子中,行是先按Row Key
排序,然后再按[=12=排序吗? ],最后由 Qualifier
?
让我们从宽列数据库的definition开始。
Its architecture uses (a) persistent, sparse matrix, multi-dimensional mapping (row-value, column-value, and timestamp) in a tabular format meant for massive scalability (over and above the petabyte scale).
关系数据库旨在维护实体与描述实体的列之间的关系。一个很好的例子是客户 table。这些列包含描述客户姓名、地址和联系信息的值。所有这些信息对于每个客户都是相同的。
宽列数据库是 NoSQL 数据库的一种。
也许这是四宽列数据库的更好形象。
我的理解是,顶部的第一个图像,Column 模型,就是我们所说的 entity/attribute/value table。它是特定实体(列)中的 attribute/value table。
对于客户信息,第一个广域数据库示例可能如下所示。
Customer ID Attribute Value
----------- --------- ---------------
100001 name John Smith
100001 address 1 10 Victory Lane
100001 address 3 Pittsburgh, PA 15120
是的,我们可以为关系数据库建模。 attribute/value table 的力量来自更不寻常的属性。
Customer ID Attribute Value
----------- --------- ---------------
100001 fav color blue
100001 fav shirt golf shirt
营销人员可以想到的任何属性都可以被捕获并存储在 attribute/value table 中。不同的客户可以有不同的属性。
超级列模型以不同的格式保存相同的信息。
Customer ID: 100001
Attribute Value
--------- --------------
fav color blue
fav shirt golf shirt
您可以拥有与实体一样多的超级柱模型。它们可以在单独的 NoSQL table 中,也可以放在一起作为超级列系列。
Column Family 和 Super Column family 只是简单地给图片中的前两个模型一个 row id,以便更快地检索信息。
大多数(如果不是全部)宽列存储确实是面向行的存储,因为记录的每个部分都存储在一起。您可以将其视为二维键值存储。密钥的第一部分用于跨服务器分发数据,密钥的第二部分让您快速找到目标服务器上的数据。
宽栏商店将具有不同的功能和行为。但是,例如,Apache Cassandra 允许您定义数据的排序方式。以此table为例:
| id | country | timestamp | message |
|----+---------+------------+---------|
| 1 | US | 2020-10-01 | "a..." |
| 1 | JP | 2020-11-01 | "b..." |
| 1 | US | 2020-09-01 | "c..." |
| 2 | CA | 2020-10-01 | "d..." |
| 2 | CA | 2019-10-01 | "e..." |
| 2 | CA | 2020-11-01 | "f..." |
| 3 | GB | 2020-09-01 | "g..." |
| 3 | GB | 2020-09-02 | "h..." |
|----+---------+------------+---------|
如果您的分区键是 (id)
并且您的集群键是 (country, timestamp)
,则数据将这样存储:
[Key 1]
1:JP,2020-11-01,"b..." | 1:US,2020-09-01,"c..." | 1:US,2020-10-01,"a..."
[Key2]
2:CA,2019-10-01,"e..." | 2:CA,2020-10-01,"d..." | 2:CA,2020-11-01,"f..."
[Key3]
3:GB,2020-09-01,"g..." | 3:GB,2020-09-02,"h..."
或table形式:
| id | country | timestamp | message |
|----+---------+------------+---------|
| 1 | JP | 2020-11-01 | "b..." |
| 1 | US | 2020-09-01 | "c..." |
| 1 | US | 2020-10-01 | "a..." |
| 2 | CA | 2019-10-01 | "e..." |
| 2 | CA | 2020-10-01 | "d..." |
| 2 | CA | 2020-11-01 | "f..." |
| 3 | GB | 2020-09-01 | "g..." |
| 3 | GB | 2020-09-02 | "h..." |
|----+---------+------------+---------|
如果将主键(分区键和聚簇键的组合)改为(id, timestamp) WITH CLUSTERING ORDER BY (timestamp DESC)
(id为分区键,timestamp为聚簇键,降序排列),结果为:
[Key 1]
1:US,2020-09-01,"c..." | 1:US,2020-10-01,"a..." | 1:JP,2020-11-01,"b..."
[Key2]
2:CA,2019-10-01,"e..." | 2:CA,2020-10-01,"d..." | 2:CA,2020-11-01,"f..."
[Key3]
3:GB,2020-09-01,"g..." | 3:GB,2020-09-02,"h..."
或table形式:
| id | country | timestamp | message |
|----+---------+------------+---------|
| 1 | US | 2020-09-01 | "c..." |
| 1 | US | 2020-10-01 | "a..." |
| 1 | JP | 2020-11-01 | "b..." |
| 2 | CA | 2019-10-01 | "e..." |
| 2 | CA | 2020-10-01 | "d..." |
| 2 | CA | 2020-11-01 | "f..." |
| 3 | GB | 2020-09-01 | "g..." |
| 3 | GB | 2020-09-02 | "h..." |
|----+---------+------------+---------|