Nosql 柱族概念与数据模型

Nosql 柱族概念与数据模型,nosql,datamodel,Nosql,Datamodel,我正在研究不同类型的NoSQL数据库类型,并试图了解列族存储的数据模型,如Bigtable、HBase和Cassandra 第一个模型 有些人将列族描述为行的集合,其中每行包含列[]、[]。此模型的示例(柱族大写): 第二种模式 其他站点将列族描述为行[]、[]中的一组相关列。以这种方式建模的前一示例中的数据: { "codinghorror": { "USER": { "name": "Jeff", "blog": "http://codinghorror.com/" },

我正在研究不同类型的NoSQL数据库类型,并试图了解列族存储的数据模型,如Bigtable、HBase和Cassandra

第一个模型 有些人将列族描述为行的集合,其中每行包含列[]、[]。此模型的示例(柱族大写):

第二种模式 其他站点将列族描述为行[]、[]中的一组相关列。以这种方式建模的前一示例中的数据:

{
  "codinghorror":
  {
    "USER": { "name": "Jeff", "blog": "http://codinghorror.com/" },
    "BOOKMARK":
    {
      "http://codinghorror.com/": "My awesome blog",
      "http://unicorns.com/": "Weaponized ponies"
    }
  },
  "jonskeet":
  {
    "USER": { "name": "Jon Skeet", "email": "jskeet@site.com" },
    "BOOKMARK":
    {
      "http://msmvps.com/blogs/jon_skeet/": "Coding Blog",
      "http://manning.com/skeet2/": "C# in Depth, Second Edition"
    }
  }
}
第一个模型背后的一个可能原理是并非所有列族都具有类似于
USER
BOOKMARK
do的关系。这意味着并非所有列族都包含相同的键。从这个角度来看,将柱族放置在外部标高上感觉更自然

名称“column family”表示一组列。这正是柱族在第二个模型中的显示方式

这两个模型都是数据的有效表示形式。我意识到这些表示仅用于向人类传达数据;应用程序不会以这种方式“思考”数据

问题: 柱族的“标准”定义是什么?它是行的集合,还是行中的一组相关列

我必须写一篇关于这个主题的论文,所以我也对人们通常如何向其他人解释“专栏家庭”的概念感兴趣。这两种模式似乎相互矛盾。我想用“正确的”或普遍接受的模型来描述column系列商店


更新
我已经决定使用第二个模型来解释本文中的数据模型。我仍然对您如何向其他人解释column家族商店的数据模型感兴趣。

我认为Cassandra数据库遵循您的第一个模型。ColumnFamily是行的集合,可以稀疏地包含任何列(因此,如果需要,每行可以有不同的列名集合)。行中允许的列数几乎是无限的(Cassandra v0.7中为20亿)

一个关键点是,根据定义,行键在列族中必须是唯一的,但可以在其他列族中重复使用。因此,可以在不同的列族中存储关于同一个键的无关数据


在Cassandra中,这很重要,因为特定列族中的数据存储在磁盘上的相同文件中,因此将可能一起检索的数据项放在同一列族中更有效。这在一定程度上是一个实际的速度问题,但也是一个将数据组织成清晰模式的问题。这涉及到您的第二个定义——人们可能认为所有关于特定键的数据都是“行”,但由列族分隔。但是,在Cassandra中,它实际上不是一行,因为对于同一行键,一个ColumnFamily中的数据可以独立于其他ColumnFamily中的数据进行更改。

根据我的理解,Cassandra ColumnFamily不是行的集合,而是列的集群。 根据聚类键将列聚集在一起。 例如 让我们考虑下面的栏目家庭:

CREATE TABLE store (
  enrollmentId int,
  roleId int,
  name text,
  age int,
  occupation text,
  resume blob,
  PRIMARY KEY ((enrollmentId, roleId), name)
) ;


INSERT INTO store (enrollmentid, roleid, name, age, occupation, resume)
values (10293483, 01, 'John Smith', 26, 'Teacher', 0x7b22494d4549);
通过使用cassandra cli获取上面插入的详细信息,它基于集群键进行了很好的集群,在本例中,“name=John Smith”是集群键

RowKey: 10293483:1
=> (name=John Smith:, value=, timestamp=1415104618399000)
=> (name=John Smith:age, value=0000001a, timestamp=1415104618399000)
=> (name=John Smith:occupation, value=54656163686572, timestamp=1415104618399000)
=> (name=John Smith:resume, value=7b22494d4549, timestamp=1415104618399000)

您描述的两种型号都是相同的

柱族是:

Key -> Key -> (Set of key/value pairs)
从概念上讲,它变成:

Table -> Row -> (Column1/Value1, Column2/Value2, ...)
将其视为键/值对映射的映射

UserProfile = {
    Cassandra = [emailAddress:"cassandra@apache.org", age:20],
    TerryCho = [emailAddress:"terry.cho@apache.org", gender:"male"],
    Cath = [emailAddress:"cath@apache.org", age:20, gender:"female", address:"Seoul"],
}
上面是柱族的一个示例。如果要将其制表,您将得到一个名为UserProfile的表,该表如下所示:

UserName | Email | Age | Gender | Address
Cassandra | cassandra@apache.org | 20 | null | null
TerryCho | terry.cho@apache.org | null | male | null
Cath | cath@apache.org | 20 | female | Seoul
令人困惑的是,实际上没有我们习惯于思考的列或行。有一堆“列族”,它们是按名称(键)查询的。这些族包含一组键/值对,它们也可以按名称(行键)查询,最后,还可以按名称(列键)查找集中的每个值

如果您需要表格参考点,“列族”将是您的“表”。其中的每个“k/v对集”都是您的“行”。每个“集合对”都是“列名及其值”

在内部,每一列内部的数据将被存储在一起,并且它将被存储为一行接一行,在每一行中,列是一行接一行。所以你得到
row1->col1/val1,col2/val2,行2->col1/val1…,…->。因此,从这个意义上讲,数据的存储更像是行存储,而不像列存储


最后,这里用词的选择是不幸和误导的。列族中的列应称为属性。行应该被称为属性集。列族应称为属性族。与经典表格词汇的关系很弱,而且容易引起误解,因为它实际上非常不同。

谢谢分享您的想法!我的结论是,这没有对错之分,你的回答只是证实了这一点。它基本上是一个二维(或三维)矩阵,就像一个传统的数据库表,但由于内容的稀疏性,它不适合通常的表格格式:)+1篇好文章,如果你的文章可以在线阅读,我很乐意阅读(如果可以,请更新文章)。@tbone谢谢!这篇文章在网上是没有的,但如果我有时间的话,我可能会把它的一部分转换成博客文章。
UserName | Email | Age | Gender | Address
Cassandra | cassandra@apache.org | 20 | null | null
TerryCho | terry.cho@apache.org | null | male | null
Cath | cath@apache.org | 20 | female | Seoul