我正在调查不同类型的NoSQL数据库,并试图理解列族存储的数据模型,比如Bigtable、HBase和Cassandra。
第一种模型
有些人将列族描述为一个行的集合,每一行包含多个列 [1], [2]。下面是这种模型的一个例子(列族使用大写):
{
"USER":
{
"codinghorror": { "name": "Jeff", "blog": "http://codinghorror.com/" },
"jonskeet": { "name": "Jon Skeet", "email": "jskeet@site.com" }
},
"BOOKMARK":
{
"codinghorror":
{
"http://codinghorror.com/": "My awesome blog",
"http://unicorns.com/": "Weaponized ponies"
},
"jonskeet":
{
"http://msmvps.com/blogs/jon_skeet/": "Coding Blog",
"http://manning.com/skeet2/": "C# in Depth, Second Edition"
}
}
}
第二个模型
其他网站将列族描述为一行内相关列的组合[3], [4]。按照这种方式建模的先前示例中的数据:
{
"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那样有关系。这意味着并非所有列族都包含相同的键。从这个角度看,将列族放在外层级别更自然。“列族”的名称暗示了一组列。这正是第二个模型中展示列族的方式。
两种模型都是有效的数据表示形式。我意识到这些表示仅用于向人类传达数据;应用程序不会以这种方式“思考”数据。
问题:列族的“标准”定义是什么?它是一组行,还是一行内相关的列组?
我必须写一篇关于这个主题的论文,所以我也对人们通常如何向其他人解释“列族”概念感兴趣。这两个模型似乎相互矛盾。我想使用“正确的”或普遍接受的模型来描述列族存储。
更新:
我已经确定了第二个模型,用于解释我的论文中的数据模型。我仍然对你如何向他人说明列族存储的数据模型感兴趣。