HBase - 使用一列含有值列表与使用一列列和列列的优缺点是什么?

时间:2014-03-20 18:43:01

标签: hadoop hbase bigdata schema-design

假设我们正在为用户和朋友建模,而朋友有类型。

我们可以在Oracle中对其进行建模,如:

User: id, name, sex, age
Friendship: user_id, friend_id, type

所以在HBase中,我们可以这样做:

(第一个模型来自here,这是HBase FAQ推荐的)

Table: Users
RowKey = <user_id>
Column Family = Info; Columns = "Name", "Sex", "Age"
Column Family = Friend; Columns = "Friend:<user_id>"=type

(其中&#34;朋友:&#34; =类型可能是另外一个user_ids)

Table: Users
RowKey = <user_id>
Column Family = Info; Columns = "Name", "Sex", "Age", "Friends"

(其中&#34; Friends&#34;是[{user_id:,type:},...]

形式的JSON字符串

但是,如果朋友没有类型,则第二个模型可能只是[user_id:<user_id>, ...]。如果朋友没有类型,第一个模特会做什么?

这两种方法的优点和好处是什么?

2 个答案:

答案 0 :(得分:0)

带有值列表的一列会破坏规范化规则。如果您不知道这些是什么或为什么它们很重要,请做一些研究。

我认为这两种模型都不正确。一对多关系应该正确建模。你的模式都破坏了规范化规则。

答案 1 :(得分:0)

这实际上取决于您拥有多少朋友以及您的读写访问模式。

在第一种情况下,每位朋友都可以添加朋友而无需阅读所有其他朋友。但是,您还会为每位朋友获取单独的时间戳值,从而增加每位朋友的总存储要求。

此外,如果您在阅读用户时并不总是阅读朋友,则第一种情况不需要您加载朋友。您可以执行单列族扫描并避免所有额外的IO。

更多列系列的缺点是您有更多的MemStores,因此您的区域需要更多内存。它还意味着更多的非顺序磁盘刷新,因为每个列系列都是一个单独的磁盘刷新。

相关问题