hbase-如何将实体嵌套到表的两个(+)级别?

des4xlb0  于 2021-06-04  发布在  Hadoop
关注(0)|答案(2)|浏览(425)

我在看这个幻灯片[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模式中嵌套两个层次的含义,还是有更好的方法呢?

vwkv1x7d

vwkv1x7d1#

如果表存在于父子关系、主-明细关系或其他严格的一对多关系中,则可以在hbase中将其建模为一行。rowkey将对应于父实体。嵌套的值将包含子实体,其中每个子实体获得一个列限定符,将其标识属性存储在其中,其余的非标识属性存储在值中。实hbase行定义父记录;子实体的记录存储为单独的列。由于列的设计方式,您可以使用hbase的灵活性放入嵌套实体。hbase不一定具有存储嵌套实体的特殊能力。当然,这也有一些局限性。首先,这种技术只适用于一个层次:嵌套实体本身不能有嵌套实体。在一个父实体中仍然可以有多个不同的嵌套子实体,列限定符是它们的标识属性。第二,与访问另一个表中的行相比,访问作为嵌套列限定符存储在行中的单个值的效率要低,正如您在本章前面所了解的那样。尽管如此,仍有令人信服的案例表明这种模式设计是合适的。如果获得子实体的唯一方法是通过父实体,并且您希望对父实体的所有子实体提供事务性保护,那么这是正确的方法。
从行动中

kxxlusnw

kxxlusnw2#

使用一种简单的序列化格式(如json)来存储嵌套数据,而不是一些自定义的下划线分隔字符串。在您的示例中,customer 1:m meetings和meetings 1:m attendes,您首先需要决定您想要什么样的单元粒度。
对于单个客户,每个与会者是否都应该在自己的单元中?或者让每个会议都在自己的单元中就足够了?
可以使用如下列限定符:

meeting:17          (Meeting 17)
attendee:17:5       (Meeting 17, Attendee 5)

相关问题