完全反规范化(1nf)或使用可变数量的列作为内部表/列表(0nf)?

e0bqpujr  于 2021-06-09  发布在  Hbase
关注(0)|答案(1)|浏览(265)

在学习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\u attendee\u 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”拆分为两个表,一个表有两列(customer\u id,capacity),另一个表有两列(customer\u id,dedicated\u host\u attendee\u 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>)
);

在hbase术语中,一个列族将始终具有以下三列:customer\u id、meeting\u id、host\u attendee\u id。。。与会者;换句话说,根据列族的数量而改变列的数量,类似于oracle中的嵌套表或varray。
如何最好地实现这一点?

u1ehiz5o

u1ehiz5o1#

hbase有很大的灵活性,您可以做您所描述的所有事情,甚至更多(比如将实际数据放入键中等等)。要设计正确的模式,您需要考虑对数据的访问模式(读取和写入)
例如,当您必须同时更新许多列时,您可能希望将它们保留在同一行中(以获得原子性),如果您需要通过配置单元(或其他sql前端)进行访问,您需要在使用列的方式上更加保守,键等。如果您访问某些维度上的数据的频率更高,则会将其升级到键或升级某些数据等。
因此,从本质上讲,如果您需要关于正确设计的建议,那么您需要提供更多的上下文信息—即您试图对数据执行的操作

相关问题