列数据库作为键/值对的嵌套映射

1,553 阅读3分钟

列数据库作为键/值对的嵌套映射

尽管将列数据库视为具有特殊属性的表很容易理解,但它会造成混乱。

通常,像列和表这样的术语会立即让人联想到关系数据库的想法,并引导您这样规划架构。

这可能是有害的,并且通常会导致开发人员重新使用关系存储等列数据库。这当然是每个人都需要避免的一个设计陷阱。

永远记住,为工作使用正确的工具比工具本身更重要。

如果RDBMS是你需要的,那么就使用它。但是,如果您使用列数据库来扩展庞大的数据存储,则无需任何 RDBMS 包袱即可使用它。

通常,将列数据库视为一组嵌套映射更容易。映射或哈希映射(也称为关联数组)是键对及其相应的值。键必须是唯一的以避免冲突,值通常可以是任何字节数组。某些映射只能保存字符串键和值,但大多数列数据库没有此类限制。

毫不奇怪,Google Bigtable是当前一代列数据库的最初灵感来源,它被正式定义为稀疏、分布式、持久、多维和排序的地图。

“Bigtable: A Distributed Storage System for Structured Data”,Fay Chang等人。

“数据模型”中对Bigtable的定义如下:

“Bigtable 是一个稀疏的、分布式的、持久的多维排序地图。映射由行键、列键和时间戳编制索引;映射中的每个值都是一个未解释的字节数组。

将运行的示例视为多维嵌套映射,您可以以类似 JSON 的表示形式创建前两级键,如下所示:

{"row_key_1" : {
    "name" : [
    ...
    },
"location" : {
    ...
},
"preferences " :{
    ...
},
"row_key_2" : {
    "name" :{
        ...
    },
"location" : {
    ...
},

"preferences" :{
    ...
},

"row_key_3" : {
    ...
}

第一级键是唯一标识列数据库中记录的行键。

第二级键是列系列标识符。

前面定义了三个列族 - 名称、位置和首选项。这三个显示为二级键。按照模式,您可能已经猜到第三级键是列标识符。每行在列族中可能具有一组不同的列,因此第三级的键在多维映射中的任何两个数据点之间可能会有所不同。加上第三级,是这样的:

{
   "row_key_1" : {
      "name" : {

         "first_name" : "Jolly", 
         "last_name" : "Goodfellow"
         }
      }
   },

"location" : {
   "zip": "94301" 
   },

"preferences" : { "d/r" : "D"}

"row_key_2" : { "name" : {

            "first_name" : "very",
            "middle_name" : "Happy",
            "last_name": "Guy" },

"location" : {
   "zip" : "10001"
   },
"preferences" : {
   "v/nv": "V"
   }
   }

最后,将版本元素添加到其中,可以扩展第三级以包含带时间戳的版本。为了说明这一点,该示例使用任意整数来表示时间戳驱动的版本,然后,此行如下所示:

{"row_key_1" : "name" : {
	"first_name" : { 1: "Jolly" },
	"last_name" : { 1: "Goodfellow"}
},


"location" : { "zip": { 1 : "94301"}

"preferences" : { "d/r" : {
	1: "D", 
	5: "R"}
	}
}
...
}


这为面向列的数据库的面向映射的图片提供了线索

布置网络表

如果没有存储已爬网网页副本的所谓 Webtable 的典型示例,列数据库的讨论就不完整。

此类表除了存储与页面相关的属性外,还存储网页的内容。

此类属性可以是引用页面的定位点,也可以是与内容相关的 MIME 类型。

谷歌在其关于Bigtable的研究论文中首次介绍了这个例子。

Webtable 使用反向网页 URL 作为 Web 的行键页。

因此,URL www.example.com 意味着行键 com. example.www。行键构成了面向列的数据库中数据行顺序的前提。因此,与 example.com 的两个子域相关的行,例如 www。example.com 和新闻 .example.com,当反向 URL 用作行键时,彼此靠近存储。这使得查询与域相关的所有内容变得更加容易。

通常,内容、定位点和 MIME 充当列系列,这会导致一个类似于图下所示的基于列的表的概念模型

image.png

许多流行的 Bigtable 开源实现在其文档中都以 Webtable 为例。


本文正在参加「金石计划 . 瓜分6万现金大奖」