是我在3NF的下表。即使重复如下,我如何保持3NF?

时间:2014-04-08 19:59:12

标签: mysql sql database postgresql normalization

这就是我构建表格的方式。这些表分别是AGENT,OFFICE,TRAINING。与问题行相同,是3NF中的下表吗?拥有2个FK是不好的做法吗?

当我们假设每个办公室只有一个代理或者每个代理只有一个培训时,情况就好了。当我查看有超过1名代理商和代理商进行超过1次培训的办公室时,它变得凌乱,不再是3NF。第一组表没有重复。第二组显示重复。请指教。谢谢。

不重复:

1

相同的表但信息重复:

enter image description here

1 个答案:

答案 0 :(得分:1)

获得3NF的最简单方法是应用实体关系建模方法

  1. 识别实体
  2. 确定实体之间的关系
  3. 确定关系每个方向的每个关系的基数(例如,一对多_一个,一对多,多对多等)。
  4. 每个关系的基数将揭示关系的哪一方应该获得外键,或者是否应该添加额外的表来解决多对多关系。

    例如,如果办公室可以拥有多个代理,但代理最多只能与一个办公室相关联,则外键将是代理表上的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,应用程序实现控制/管理冗余的逻辑。