这就是我的表格结构。桌子分别是代理、办公室、培训。与问题行相同,下表是3NF格式的吗?有2FK是不是不好?
当我们假设每个办公室只有一个代理或者每个代理只有一个培训时,一切都很好。当我调查一个以上的代理和一个以上的培训代理的办公室时,它变得凌乱,不再是3NF。第一套桌子没有重复。第二组显示重复。请指教。谢谢。
无重复:
相同的表格,但信息重复:

最佳答案

获得3NF的最简单方法是应用实体关系建模方法
确定实体
确定实体之间的关系
在关系的每个方向上确定每个关系的基数(例如一对零或一、一对多、多对多等)。
每个关系的基数将显示该关系的哪一侧应获取外键,或者是否应添加一个附加表来解析多对多关系。
例如,如果一个办公室可以有多个代理,但一个代理最多只能与一个办公室相关,那么外键将是代理表上的office_id列。如果一个代理可以与多个办公室关联,并且办公室可以有多个代理,则添加第三个表agent_office,该表有两个外键,office_idagent_id,每个外键引用一个相关的表(officeagent
假设:
实体:
办公室
代理人
训练
关系:
代理可以与零个、一个或多个办公室相关
一个办公室可以与零个、一个或多个代理相关
代理可以与零个、一个或多个培训相关
培训可以与零个、一个或多个代理相关

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'
, ...
)

要解决代理和office之间的多对多关系:
 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)
 )

同样,对于代理和培训之间的多对多关系,我们添加了另一个表:
 CREATE TABLE agent_training
 ( agent_id INT UNSIGNED COMMENT 'composite PK, FK ref agent.id'
 , training_id INT UNSIGNED COMMENT 'composite PK, FK ref training.id'
 , PRIMARY KEY (agent_id, training_id)
 , CONSTRAINT FK_agent_training_agent FOREIGN KEY (agent_id) REFERENCES agent (id)
 , CONSTRAINT FK_agent_training_training FOREIGN KEY (training_id) REFERENCES training (id)
 )

在某些边缘情况下,对(代理id,办公室id)元组可能没有唯一的约束,特别是当我们考虑保留时间数据时。(例如,如果我们需要跟踪代理99从2009年到2011年被分配到Office 7,并从2013年开始再次被分配到Office 7。)但是如果我们需要我们的模型来回答的只是代理是否被“分配”到特定的办公室,那么我们可以对(代理id,办公室id)元组有一个唯一的约束。
就“训练”而言,是指某一特定的训练课程(例如“敏感度”),如果86号特工反复参加相同的“训练”该怎么办。然后我们可能会有一个“培训课程”表,与“培训课程”相关,但在特定的时间和地点提供。然后我们可能会有一段关系“经纪人参加了培训班”。
无论如何,这种实体关系建模方法是获得3NF模型的最快方法。
对于实现一个纯粹的3NF模型是否最适合某个特定的应用程序,有人提出了自己的看法。从3NF反规范化模型,即引入受控冗余,有效地“打破”了3NF,并且非常适合一些应用,主要是因为它提供了一些性能优势,并且可以使一些代码更简单。
这里的关键是我们知道冗余,数据库实现不是3NF,应用程序实现控制/管理冗余的逻辑。

关于mysql - 是我在3NF中的下表。即使重复以下操作,如何保持3NF?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/22946973/

10-09 05:48