【问题标题】:What exactly is a wide column store?什么是宽列存储?
【发布时间】:2020-09-12 13:28:05
【问题描述】:

谷歌搜索定义要么返回面向列的数据库的结果,要么给出非常模糊的定义。

我的理解是,宽列存储由包含行和列的列族组成。所述系列中的每一行都一起存储在磁盘上。这听起来像是面向行的数据库存储数据的方式。这让我想到了我的第一个问题:

宽列存储与常规关系数据库表有何不同?这是我的看法:

* column family        -> table
* column family column -> table column
* column family row    -> table row

Database Internals 中的这张图片看起来就像两个常规表:

我对不同之处的猜测来自于“多维地图”在侧宽列存储中被提及的事实。所以这是我的第二个问题:

宽列存储是从左到右排序的吗?意思是,在上面的例子中,行是先按Row Key排序,然后是Timestamp,最后是Qualifier

【问题讨论】:

  • 什么是宽列数据库? dataversity.net/wide-column-database/#
  • 我认为这与其他在线定义存在相同的问题,它简短而模糊:“它的架构使用持久、稀疏矩阵、多维映射(行值、列值和时间戳)以表格格式表示,用于大规模可扩展性(超过 PB 级)。列族存储不遵循关系模型,也没有针对连接进行优化。”我意识到,如果您已经了解了广泛的列存储,这可能就足够了,但如果您还没有,这无助于建立心智模型。毕竟,BigTable 论文有 14 页长。
  • 顺便说一句,我阅读了 BigTable 论文的前 2 页,它实际上是对宽列存储的最佳解释之一。会推荐任何人尝试。

标签: rdbms wide-column-store


【解决方案1】:

大多数(如果不是全部)宽列存储确实是面向行的存储,因为记录的每个部分都存储在一起。您可以将其视为二维键值存储。密钥的第一部分用于跨服务器分发数据,密钥的第二部分可以让您快速找到目标服务器上的数据。

宽栏商店将具有不同的功能和行为。但是,例如,Apache Cassandra 允许您定义数据的排序方式。以这张表为例:

| 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..."

或者表格形式:

| 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..."

或者表格形式:

| 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..."  |
|----+---------+------------+---------|

【讨论】:

    【解决方案2】:

    让我们从宽列数据库的definition开始。

    其架构使用 (a) 持久、稀疏矩阵、多维 表格格式的映射(行值、列值和时间戳) 意味着大规模的可扩展性(超过 PB 级)。

    关系数据库旨在维护实体与描述实体的列之间的关系。一个很好的例子是客户表。这些列包含描述客户姓名、地址和联系信息的值。所有这些信息对于每个客户都是相同的。

    宽列数据库是 NoSQL 数据库的一种。

    也许这是四个宽列数据库的更好图像。

    我的理解是顶部的第一张图片,Column 模型,就是我们所说的entity/attribute/value 表。它是特定实体(列)中的属性/值表。

    对于客户信息,第一个广域数据库示例可能如下所示。

    Customer ID    Attribute    Value
    -----------    ---------    ---------------
         100001    name         John Smith
         100001    address 1    10 Victory Lane
         100001    address 3    Pittsburgh, PA  15120
    

    是的,我们可以为关系数据库建模。属性/值表的强大之处在于更不寻常的属性。

    Customer ID    Attribute    Value
    -----------    ---------    ---------------
         100001    fav color    blue
         100001    fav shirt    golf shirt
    

    营销人员可以想象的任何属性都可以被捕获并存储在属性/值表中。不同的客户可以有不同的属性。

    Super Column 模型以不同的格式保存相同的信息。

    Customer ID: 100001
    Attribute    Value
    ---------    --------------
    fav color    blue
    fav shirt    golf shirt
    

    您可以拥有与实体一样多的超级列模型。它们可以位于单独的 NoSQL 表中,也可以放在一起作为超级列族。

    Column Family 和 Super Column family 只是为图片中的前两个模型提供了一个 row id,以便更快地检索信息。

    【讨论】:

    • 感谢您的详细回复!
    • 很好的答案 - 非常感谢。这些示例和与 EAV 的链接确实让我想起了这个概念。
    猜你喜欢
    • 1970-01-01
    • 2022-01-25
    • 2014-12-05
    • 2017-10-09
    • 1970-01-01
    • 2020-01-31
    • 2018-02-24
    • 2012-06-21
    • 1970-01-01
    相关资源
    最近更新 更多