使用面向列的数据库
Google的Bigtable和Apache HBase是Hadoop的一部分,都是面向列的数据库。
Hypertable和Cloudata也是如此。这些数据存储中的每一个在几个方面各不相同,但具有共同的基本基础。
当开发人员在工作中使用关系数据库系统,并不断被谈论和阅读,基本关系数据库管理系统(RDBMS)的概念,如实体及其关系,已经与数据库的概念密不可分。
在关系数据库中使用表和列
在 RDBMS 中,实体的属性存储在表列中。列是预先定义的,值存储在表中的所有元素或行的所有列中。请参阅图以加强您的理解。
这个基本示例有五列。
将此表存储在 RDBMS 中时,需要定义每列的数据类型。
例如,您可以将存储名字的列设置为 VARCHAR(或变量字符类型),将 ZIP 设置为整数(在美国,所有邮政编码都是整数)。您可以有一些单元格,行和列的交集,具有不存在的值(即 NULL)。例如,Jolly Goodfellow没有中间名,因此此人的中间名列值为NULL。
通常,RDBMS 表有几列,有时有几十列。该表本身最多可容纳几千条记录。
在特殊情况下,关系表中可能会保留数百万行,但保留如此大量的数据可能会导致数据访问停止,除非应用了非规范化等特殊注意事项。
当您开始使用表来存储和访问数据时,您可能需要更改它以保存一些其他属性。这些属性可能是街道地址和食物偏好。随着较新记录的存储,以及这些较新属性的值,现有记录中这些属性的值可能为空。此外,当您保留更多种类的属性时,稀疏数据的可能性
sets - 在许多单元格中具有 null 的集合 - 变得越来越真实。在某些时候,您的表可能类似于下图中的表。
现在,考虑到此数据正在演变,您必须存储单元格值的每个版本。
把它想象成一个三维的Excel电子表格,其中第三个维度是时间。
然后,随时间演变的值可以被认为是多个电子表格中的单元格值,按时间顺序一个接一个。
浏览下图以了解三维 Excel 抽象电子表格。
尽管该示例非常简单,但您可能已经感觉到,随着数据的发展而更改表、存储大量稀疏单元格以及处理值版本可能会变得复杂。或者更准确地说,如果在 RDBMS 的帮助下处理,则很复杂!您很可能在自己的应用程序中经历过其中的一些情况。
列数据库与 RDBMS 的对比
接下来,引入列数据库来建模和存储相同的示例。
由于到目前为止,该示例已使用RDBMS进行介绍,因此与RDBMS相比,了解列数据库可以清楚地突出其关键功能。
首先,面向列的数据库对前期架构定义的需求最小,并且随着数据的发展,可以轻松容纳较新的列。
在典型的面向列的存储中,您可以预定义列系列而不是列。列系列是组合在一起到一个捆绑包中的一组列。列族中的列在逻辑上彼此相关,尽管这不是必需的。列系列成员在物理上存储在一起,通常用户通过将具有相似访问特征的列组合到同一系列中而受益。对于可以定义的列族数,理论上几乎没有限制,但将它们保持在最低限度有助于保持架构的可塑性。在手头的示例中,定义三个列系列(特别是名称、位置和首选项)可能就足够了。
在列数据库中,列族类似于 RDBMS 中的列。两者都通常在数据存储在表中之前定义,并且本质上是相当静态的。RDBMS 中的列定义了它们可以存储的数据类型。列族没有这样的限制;它们可以包含任意数量的列,这些列可以存储任何类型的数据,只要它们可以作为字节数组持久化。
面向列的数据库表的每一行仅将数据值存储在具有有效值的列中。根本不存储空值。在此阶段,您可能会受益于下图,其中当前示例已变形以适合列存储模型。
除了作为稀疏和可延展数据集的友好存储容器外,列数据库还存储每个单元格的多个版本。因此,当前示例中不断发展的数据将存储在列数据库中,如下图所示。
在物理存储中,数据不存储为单个表,而是按列系列存储。列数据库旨在扩展,可以轻松容纳数百万列和数十亿行。因此,单个表通常跨越多台计算机。行键唯一标识列数据库中的行。随着数据的增长,行被排序并拆分为包含连续值的捆绑包。下图更详细地描述了数据的物理存储方式。
典型的列数据库部署在群集中,但出于开发和实验目的,您可以在单个节点中运行它。每个列数据库都有自己的特殊网络拓扑和部署体系结构,但深入了解其中任何一个都应该提供一个典型方案。
最后
最近还整理一份JavaScript与ES的笔记,一共25个重要的知识点,对每个知识点都进行了讲解和分析。能帮你快速掌握JavaScript与ES的相关知识,提升工作效率。