Database design Hbase架构设计-完全非规范化(1NF)或使用可变数量的列作为内部表/列表(0NF)?

Database design Hbase架构设计-完全非规范化(1NF)或使用可变数量的列作为内部表/列表(0NF)?,database-design,schema,hbase,database-schema,Database Design,Schema,Hbase,Database Schema,我试图在学习HBase的同时制定一个会议/与会者计划 我正在讨论是否将关系从第三范式反规范化为第一范式(原子性/列内无值集)或0范式(非原子性/一列内有值集) 本质上,我试图确定如何将以下关系模式转换为HBase: CREATE TABLE customer ( customer_id INT PRIMARY KEY ,capacity INT ); CREATE TABLE attendee ( attendee_id INT PRIMARY KEY custo

我试图在学习HBase的同时制定一个会议/与会者计划

我正在讨论是否将关系从第三范式反规范化为第一范式(原子性/列内无值集)或0范式(非原子性/一列内有值集)

本质上,我试图确定如何将以下关系模式转换为HBase:

CREATE TABLE customer (
    customer_id INT PRIMARY KEY
    ,capacity INT
);
CREATE TABLE attendee (
    attendee_id INT PRIMARY KEY
    customer_id INT REFERENCES customer (customer_id)
);
CREATE TABLE customer_dedicated_hosts (
    customer_id INT REFERENCS customer (customer_id)
    ,dedicated_host_attendee_id INT REFERENCES attendee (attendee_id)
);
CREATE TABLE meeting (
    meeting_id INT PRIMARY KEY
    ,host_attendee_id INT REFERENCES attendee (attendee_id)
);
CREATE TABLE meeting_attendee (
    meeting_id INT
    ,attendee_id INT
    ,CONSTRAINT ... PRIAMRY KEY (meeting_id, attendee_id)
);
“客户”有1:M的与会者

与会者有M:N个会议

会议由与会者主持,因此通过host_attendee_id FK链接到与会者

一个客户有许多允许主持会议的与会者——列在CustomerDedicatedHosts中。如果客户的与会者主持的会议不是专门的主持人,则应处以罚款

每个会议都有特定客户的与会者。如果一个客户在一次会议上超过了他的能力,他应该被罚款

我很好奇,这一切是否都应该在一个或两个具有一个列族的表中完成——具有大量重复的非规范化表。相当于

CREATE TABLE hostapp (
    customer_id INT
    ,capacity
    ,dedicated_host_attendee_id
    --ROWKEY == customer_id, dedicated_host_attendee_id
);
CREATE TABLE meetingapp (
    customer_id INT
    ,attendee_id INT
    ,meeting_id INT
    ,host_attendee_id INT
    --ROWKEY == customer_id, meeting_id, attendee_id
);
在这种情况下,我无法完全理解非规范化。为什么不将“hostapp”拆分为两个表,一个表有两列(客户id、容量),另一个表有两列(客户id、专用主机id、与会者id)。我想我可以使用meetingapp表中重复的host\u attendee\u id,但为什么不将会议应用程序拆分为两个表(customer\u id、meeting\u id、host\u attendee\u id)和(meeting\u id、attendee\u id)

这是设计这个模式的正确方法,还是应该采取不同的方式

我还想知道我可以在多大程度上滥用列族中的列,将它们像oracle中的嵌套表一样使用

CREATE TABLE meetingapp (
    customer_id INT
    meeting_id INT
    host_attendee_id INT
    attendees VARRAY(<INT>)
);
CREATE TABLE meetingapp(
客户识别码
会议地址
主持人\与会者\ id INT
与会者VARRAY()
);
在hbase术语中,一个列族将始终具有以下三列:客户id、会议id、主持人id。同一列族或另一列族将具有以下列:与会者1、与会者2、。。。与会者;换句话说,根据列族的数量,列的数量是可变的,类似于Oracle中的嵌套表或varray


如何最好地实现这一点?

HBase具有很大的灵活性,您可以执行所有描述的操作,甚至更多操作(如将实际数据放入键中等)。要设计正确的模式,您需要考虑对数据的访问模式(读取和写入)

例如,当您必须同时更新许多列时,您可能希望将它们保持在同一行中(以获得原子性),如果您需要通过配置单元(或其他SQL前端)进行访问,您需要在如何使用列方面更加保守,键等。如果您更频繁地访问某些维度上的数据,则可以将其升级到键或升级某些数据等

因此,从本质上讲,如果您想要获得有关正确设计的建议,您需要提供更多的上下文信息,即您试图对数据执行的操作