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:&lt;user_id&gt;, ...]。如果朋友没有类型,第一个模型会做什么?

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

【问题讨论】:

【参考方案1】:

包含值列表的一列违反了规范化规则。如果您不知道它们是什么或为什么它们很重要,请进行一些研究。

我认为这两种模型都不正确。一对多的关系应该被正确建模。您的两个架构都违反了规范化规则。

【讨论】:

这适用于 HBase,而不是关系数据库。为了清楚起见,我进行了编辑。【参考方案2】:

这真的取决于你有多少朋友以及你的读写访问模式是什么。

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

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

更多列族的缺点是您拥有更多 MemStore,因此您的区域需要更多内存。这也意味着更多的非顺序磁盘刷新,因为每个列族都是单独的磁盘刷新。

【讨论】:

以上是关于HBase - 使用带有值列表的一列与使用带有列列表的一列族的优缺点是啥?的主要内容,如果未能解决你的问题,请参考以下文章

同一 INSERT 期间另一列中序列列的参考值

如何将带有html标签的一列文本转换为excel中vba中的格式化文本

Pandas Multiindex Groupby 聚合列与另一列的值

带有选择位置的 pyspark 新列

如何将带有列表值的熊猫列连接到一个列表中?

BigQuery 将 rank / percent_rank 应用于带有 WHERE 子句的列