第一个模型
有些人将列系列描述为行的集合,其中每行包含列[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" } } }
第二种模式
其他站点将列族描述为行内的一组相关列[4].以前的例子的数据,以这种方式建模:
{ "codinghorror": { "USER": { "name": "Jeff","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",Second Edition" } } }
第一个模型背后的一个可能的原因是,并不是所有的列系列都具有像USER和BOOKMARK这样的关系.这意味着并非所有的列系列都包含相同的键.从这个角度来看,将列家族置于外层是比较自然的.
名称“列族”表示一组列.这正是在第二个模型中列列如何呈现.
这两个模型都是数据的有效表示.我意识到这些表述只是为了将数据传达给人类;应用程序不会以这种方式“思考”数据.
题
列系列的“标准”定义是什么?是行的集合还是行中的一组相关列?
我必须写一篇关于这个问题的论文,所以我也对人们通常向其他人解释“列家庭”概念感兴趣.这两个模型似乎都相互矛盾.我想使用“正确”或普遍接受的模型来描述列家族商店.
更新
我已经在第二个模型中解决了我的论文中的数据模型.我仍然对如何将列家族商店的数据模型解释给其他人感兴趣.
一个关键点是,按照定义,行键必须在列系列中是唯一的,但可以在其他列系列中重新使用.因此,您可以在不同的ColumnFamily中存储与相同键无关的数据.
在Cassandra中这是重要的,因为特定列系列中的数据存储在磁盘上的相同文件中 – 因此将同一列ColumnFamily中可能一起检索的数据项放在一起更为有效.这部分是一个实际的速度关注,也是将您的数据组织成一个明确的模式的问题.这涉及到您的第二个定义 – 可以将所有关于特定键的数据视为“行”,而是由Column Family进行分区.但是,在Cassandra中,它不是一个单行,因为一个ColumnFamily中的数据可以独立于其他ColumnFamily中相同行键的数据进行更改.