这就是我构建表格的方式。这些表分别是AGENT,OFFICE,TRAINING。与问题行相同,是3NF中的下表吗?拥有2个FK是不好的做法吗?
当我们假设每个办公室只有一个代理或者每个代理只有一个培训时,情况就好了。当我查看有超过1名代理商和代理商进行超过1次培训的办公室时,它变得凌乱,不再是3NF。第一组表没有重复。第二组显示重复。请指教。谢谢。
不重复:
相同的表但信息重复:
答案 0 :(得分:1)
获得3NF的最简单方法是应用实体关系建模方法
每个关系的基数将揭示关系的哪一方应该获得外键,或者是否应该添加额外的表来解决多对多关系。
例如,如果办公室可以拥有多个代理,但代理最多只能与一个办公室相关联,则外键将是代理表上的office_id列。如果代理可以与多个办公室相关联,并且办公室可以有多个代理,则添加第三个表 agent_office
,其中包含两个外键 {{ 1}} 和 office_id
每个引用一个相关表格( agent_id
和 office
< / strong>,分别。)
假设:
实体:
关系:
agent
解决座席和办公室之间的多对多关系:
CREATE TABLE office
( id INT UNSIGNED PRIMARY KEY COMMENT 'PK'
, ...
)
CREATE TABLE agent
( id INT UNSIGNED PRIMARY KEY COMMENT 'PK'
, ...
)
CREATE TABLE training
( id INT UNSIGNED PRIMARY KEY COMMENT 'PK'
, ...
)
同样,对于代理和培训之间的多对多关系,我们添加了另一个表:
CREATE TABLE agent_office
( agent_id INT UNSIGNED COMMENT 'composite PK, FK ref agent.id'
, office_id INT UNSIGNED COMMENT 'composite PK, FK ref office.id'
, PRIMARY KEY (agent_id, office_id)
, CONSTRAINT FK_agent_office_agent FOREIGN KEY (agent_id) REFERENCES agent (id)
, CONSTRAINT FK_agent_office_office FOREIGN KEY (office_id) REFERENCES office (id)
)
在某些边缘情况下,(agent_id,office_id)元组可能没有唯一约束,尤其是当我们考虑保留时态数据时。 (例如,如果我们需要跟踪代理99从2009年到2011年被分配到Office 7,并且从2013年开始再次分配到Office 7.)但是如果我们需要我们的模型回答的是代理是否是“如果分配给某个特定的办公室,那么我们就可以对(agent_id,office_id)元组有一个独特的约束。
就“训练”而言,是指特定的训练课程(例如“敏感性”),以及如果代理86重复参加相同的“训练”,该怎么办?那么我们可能会有一个“training_session”表,与“培训课程”相关,但是在特定的时间和地点提供。然后我们可能会有一个关系“代理人参加 training_session”。
无论如何,这种实体关系建模方法是获得3NF模型的最快方法。
关于是否实施纯粹的3NF模型是否最适合特定应用程序的意见。从3NF非规范化模型,即引入受控冗余,有效地“中断”3NF,非常适合某些应用,主要是因为它提供了一些性能优势,并且可以使一些代码更简单。
这里的关键是我们了解冗余,数据库实现不是3NF,应用程序实现控制/管理冗余的逻辑。