假设我们正在为用户和朋友建模,而朋友有类型。
我们可以在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>, ...]
。如果朋友没有类型,第一个模特会做什么?
这两种方法的优点和好处是什么?
答案 0 :(得分:0)
带有值列表的一列会破坏规范化规则。如果您不知道这些是什么或为什么它们很重要,请做一些研究。
我认为这两种模型都不正确。一对多关系应该正确建模。你的模式都破坏了规范化规则。
答案 1 :(得分:0)
这实际上取决于您拥有多少朋友以及您的读写访问模式。
在第一种情况下,每位朋友都可以添加朋友而无需阅读所有其他朋友。但是,您还会为每位朋友获取单独的时间戳值,从而增加每位朋友的总存储要求。
此外,如果您在阅读用户时并不总是阅读朋友,则第一种情况不需要您加载朋友。您可以执行单列族扫描并避免所有额外的IO。
更多列系列的缺点是您有更多的MemStores,因此您的区域需要更多内存。它还意味着更多的非顺序磁盘刷新,因为每个列系列都是一个单独的磁盘刷新。