HBase - 使用带有值列表的一列与使用带有列列表的一列族的优缺点是啥?
Posted
技术标签:
【中文标题】HBase - 使用带有值列表的一列与使用带有列列表的一列族的优缺点是啥?【英文标题】:HBase - What are the pros and cons of using one column with a list of values vs using one column family with a list of columns?HBase - 使用带有值列表的一列与使用带有列列表的一列族的优缺点是什么? 【发布时间】:2014-03-20 18:43:00 【问题描述】:假设我们正在建模用户和朋友,而朋友有一个类型。
我们可以在 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
(其中 "Friend:"=type 可能是另外一个 user_id)
或
Table: Users
RowKey = <user_id>
Column Family = Info; Columns = "Name", "Sex", "Age", "Friends"
(其中“Friends”是一个 JSON 字符串,格式为 [user_id:, type:, ...]
但是,如果朋友没有类型,则第二个模型可能只是 [user_id:<user_id>, ...]
。如果朋友没有类型,第一个模型会做什么?
这两种方法的优点和好处是什么?
【问题讨论】:
【参考方案1】:包含值列表的一列违反了规范化规则。如果您不知道它们是什么或为什么它们很重要,请进行一些研究。
我认为这两种模型都不正确。一对多的关系应该被正确建模。您的两个架构都违反了规范化规则。
【讨论】:
这适用于 HBase,而不是关系数据库。为了清楚起见,我进行了编辑。【参考方案2】:这真的取决于你有多少朋友以及你的读写访问模式是什么。
在第一种情况下,每列有一个朋友,您可以在不阅读所有其他朋友的情况下添加一个朋友。但是,您还会为每个朋友获得一个单独的时间戳值,从而增加每个朋友的总存储需求。
另外,如果您在阅读用户时并不总是阅读好友,则第一种情况不需要您加载好友。您可以进行单列族扫描并避免所有额外的 IO。
更多列族的缺点是您拥有更多 MemStore,因此您的区域需要更多内存。这也意味着更多的非顺序磁盘刷新,因为每个列族都是单独的磁盘刷新。
【讨论】:
以上是关于HBase - 使用带有值列表的一列与使用带有列列表的一列族的优缺点是啥?的主要内容,如果未能解决你的问题,请参考以下文章
如何将带有html标签的一列文本转换为excel中vba中的格式化文本