我在看这个幻灯片[slide 134](ian varely/salesforce.com at hbase con 2012),他说可以在两个层次上嵌套实体。
下面是他给出的一个嵌套一级实体的例子:
实体:乐队、演出;乐队1:m表演的地方。
Table: Band
CF:"CF"
Qualifiers:
"Name":<name>
"Genre":<genre>
"Show_<id>":venue_<id>_date_<date>_start_time_<start_time>_cover_price_<cover_price>
然而,他没有给出一个例子,说明如何嵌套两个层次的深度。我在第134张幻灯片上的最佳嘉宾应该是下面这样的。。。
实体:客户、会议、与会者;其中客户1:m会议和会议1:m与会者。
Table: Customer
CF: "CF"
Qualifiers:
"Company_name":<company_name>
"Capacity":<capacity>
"Meeting_<id>":host_<id>_start_time_<start_time>_attendee_<id>_attendee_join_time_<join_time>
但是 meeting
在每一列中都不必要地重复实体(主机标识、开始时间)。移动 meeting
属性来维护问题:
"Meeting_<id>_host_<id>_start_time_<start_time>":attendee_<id>_attendee_join_time_<join_time>
我想到的另一个选择似乎更有意义,那就是使用json:
"Meeting_<id>_host_<id>_start_time_<start_time>":[{attendee_id:<id>,join_time:<time>}, ..]
但是,为什么不在会议和专栏中使用一列作为一个巨大的json字符串呢?
这就是在hbase模式中嵌套两个层次的含义,还是有更好的方法呢?
2条答案
按热度按时间vwkv1x7d1#
如果表存在于父子关系、主-明细关系或其他严格的一对多关系中,则可以在hbase中将其建模为一行。rowkey将对应于父实体。嵌套的值将包含子实体,其中每个子实体获得一个列限定符,将其标识属性存储在其中,其余的非标识属性存储在值中。实hbase行定义父记录;子实体的记录存储为单独的列。由于列的设计方式,您可以使用hbase的灵活性放入嵌套实体。hbase不一定具有存储嵌套实体的特殊能力。当然,这也有一些局限性。首先,这种技术只适用于一个层次:嵌套实体本身不能有嵌套实体。在一个父实体中仍然可以有多个不同的嵌套子实体,列限定符是它们的标识属性。第二,与访问另一个表中的行相比,访问作为嵌套列限定符存储在行中的单个值的效率要低,正如您在本章前面所了解的那样。尽管如此,仍有令人信服的案例表明这种模式设计是合适的。如果获得子实体的唯一方法是通过父实体,并且您希望对父实体的所有子实体提供事务性保护,那么这是正确的方法。
从行动中
kxxlusnw2#
使用一种简单的序列化格式(如json)来存储嵌套数据,而不是一些自定义的下划线分隔字符串。在您的示例中,customer 1:m meetings和meetings 1:m attendes,您首先需要决定您想要什么样的单元粒度。
对于单个客户,每个与会者是否都应该在自己的单元中?或者让每个会议都在自己的单元中就足够了?
可以使用如下列限定符: