Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/86.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mysql 我的下表是3NF。即使我有如下重复,我如何保持3NF?_Mysql_Sql_Database_Postgresql_Normalization - Fatal编程技术网

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

Mysql 我的下表是3NF。即使我有如下重复,我如何保持3NF?,mysql,sql,database,postgresql,normalization,Mysql,Sql,Database,Postgresql,Normalization,这就是我构建表格的方式。表格分别为代理、办公室和培训。与问题行相同,下表是否在3NF中?有两个FK是坏习惯吗 当我们假设每个办公室只有一名代理或每个代理只有一次培训时,情况就好了。当我看到有超过1名代理人的办公室和接受过超过1次培训的代理人时,情况变得一团糟,不再是3NF。第一组表格没有重复。第二组显示重复。请给我一些建议。谢谢 不重复: 相同的表格,但信息重复: 获取3NF的最简单方法是应用实体关系建模方法 识别实体 确定实体之间的关系 在关系的每个方向上确定每个关系的基数(例如,一对零或一

这就是我构建表格的方式。表格分别为代理、办公室和培训。与问题行相同,下表是否在3NF中?有两个FK是坏习惯吗

当我们假设每个办公室只有一名代理或每个代理只有一次培训时,情况就好了。当我看到有超过1名代理人的办公室和接受过超过1次培训的代理人时,情况变得一团糟,不再是3NF。第一组表格没有重复。第二组显示重复。请给我一些建议。谢谢

不重复:

相同的表格,但信息重复:


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

  • 识别实体
  • 确定实体之间的关系
  • 在关系的每个方向上确定每个关系的基数(例如,一对零或一、一对多、多对多等)
  • 每个关系的基数将显示关系的哪一侧应该获得外键,或者是否应该添加一个额外的表来解析多对多关系

    例如,如果一个办公室可以有多个代理,但一个代理最多可以与一个办公室相关,则外键将是代理表上的office_id列。如果一个代理可以与多个办公室相关,并且一个办公室可以有多个代理,则添加第三个表
    代理办公室
    ,其中包含两个外键,
    办公室id
    代理id
    ,每个表引用一个相关表(
    办公室
    代理

    假设:

    实体:

    • 办公室
    • 代理人
    • 训练
    关系:

    • 代理可以与零个、一个或多个办事处相关
    • 办公室可以与零个、一个或多个代理相关
    • 代理可以与零、一或多个培训相关
    • 培训可以与零个、一个或多个代理相关

    要解决代理和办公室之间的多对多关系,请执行以下操作:

     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和training之间的多对多关系,我们添加了另一个表:

     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)
     )
    

    在一些边缘情况下,对(AgtTyId,Office EID)元组可能没有唯一的约束,特别是当我们考虑保留时态数据时(例如,如果我们需要跟踪代理99被分配到Office 7从2009到2011,并且再次被分配到Office 7从2013开始)。但是,如果我们需要模型回答的只是代理是否被“分配”到特定的办公室,那么我们可以对(agent\u id,office\u id)元组有一个唯一的约束

    就“培训”而言,这是一个特定的培训课程(例如“敏感度”),如果86号特工反复参加同一个“培训”,那么我们可能会有一个“培训课程”表,与“培训课程”相关,但在特定的时间和地点提供。然后我们可能会有关系“代理人参加了培训课程”


    无论如何,这种实体关系建模方法是获得3NF模型的最快方法

    关于实现纯3NF模型是否最适合某个特定应用程序,有人提出了这样的观点。从3NF中反规范化模型,即引入受控冗余,有效地“中断”“3NF,非常适合于某些应用程序,主要是因为它提供了一些性能优势,并且可以使某些代码更简单


    这里的关键是我们知道冗余,数据库实现不是3NF,应用程序实现控制/管理冗余的逻辑。

    1)识别实体2)识别实体之间的关系3)确定每个关系的基数(例如一对零、一对多、多对多等)在关系的每个方向上。这将显示关系的哪一侧应该获得外键,或者是否应该添加一个额外的表来解析多对多关系。根据第二个示例中的数据,要获得3NF实现,实际上不涉及任何意见。您需要删除所有外键从这些表中,添加两个新表:
    “代理办公室(代理id FK,办公室id FK,主键(代理id,办公室id)”
    “代理培训(代理id FK,培训id FK,主键(代理id,培训id)”
    。将一行添加到
    代理办公室
    建立一个
    代理
    和一个
    办公室
    之间的关系。关系本身也可以具有属性(即附加列)例如,
    date\u assigned
    当一个代理被分配到一个officeprimary键时,它将是一个复合键,由两列组成。
    创建表agent\u office(agent\u id INT不为NULL,office\u id INT不为NULL,主键(agent\u id,office\u id),约束FK\u agent\u office\u agent外键(agent\u id)引用代理(id),CONSTRAINT FK_agent_office_office FOREIGN KEY(office_id)REFERENCES office(id))
    。这是我们为解决多对多关系而创建的传统3NF表。(在某些边缘情况下,
    (agent_id,office_id)
    元组上可能没有唯一的约束,尤其是当存在时态数据时。)我希望我能给你一个格式化的答案。开发一个3NF模型根本不是基于“意见”的。意见来自于实现一个纯3NF模型是否是应用程序最合适的方法。3NF可能只是一个垫脚石。非规范化(引入管理冗余)与纯3NF模型相比,它可能提供性能优势。但这是一个重要的垫脚石,获得一个在概念上“起作用”的3NF模型对于
     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)
     )