AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / dba / 问题 / 147561
Accepted
hlx98007
hlx98007
Asked: 2016-08-23 21:15:48 +0800 CST2016-08-23 21:15:48 +0800 CST 2016-08-23 21:15:48 +0800 CST

对同一依赖的多重功能依赖

  • 772

我正在寻找以下关系的 3NF 形式:

1. emp_no -> phone_no, office_no, dep_no, proj_no
2. emp_no, date -> job, salary
3. phone_no -> dep_no, office_no, area
4. proj_no -> dep_no, p_buject
5. dep_no -> mgr_emp_no, d_budget
6. mgr_emp_no -> dep_no

我只能得出第一个依赖项:

1. emp_no -> phone_no, office_no, proj_no

因为proj_no和phone_no取决于dep_no. 然后其余的不可分解,因此它们被复制到我的工作表上。

如您所见,5 和 6 相互依赖。我浏览了互联网上的资源,我以前从未见过这种关系(相互依赖和父母)。如何将这些功能依赖性转换为 3NF 格式?

dependencies
  • 1 1 个回答
  • 177 Views

1 个回答

  • Voted
  1. Best Answer
    Renzo
    2016-08-24T00:37:11+08:002016-08-24T00:37:11+08:00

    要在 3NF 中引入模式,首先您必须找到依赖项的规范覆盖。然后,您可以应用“分析”算法来查找 Boyce-Codd 范式(比 3NF 更严格),或者您可以应用“综合”算法来查找 3NF。在这种情况下,两种算法都会给出相同的结果。

    这是依赖项的规范封面:

    date, emp_no → job
    date, emp_no → salary
    dep_no → d_budget
    dep_no → mgr_emp_no
    emp_no → phone_no
    emp_no → proj_no
    mgr_emp_no → dep_no
    phone_no → area
    phone_no → dep_no
    phone_no → office_no
    proj_no → dep_no
    proj_no → p_buject
    

    让我们用合成算法找到 3NF。第一步是将具有相同左侧部分的规范覆盖的所有依赖项收集在一起,即:

    date, emp_no → job
    date, emp_no → salary
    
    dep_no → d_budget
    dep_no → mgr_emp_no
    
    emp_no → phone_no
    emp_no → proj_no
    
    mgr_emp_no → dep_no
    
    phone_no → area
    phone_no → dep_no
    phone_no → office_no
    
    proj_no → dep_no
    proj_no → p_buject
    

    第二步为每个组创建一个关系,其键由公共左侧部分给出:

    R1 (date, emp_no, job, salary)          key: (date, emp_no)
    R2 (dep_no, d_budget, mgr_emp_no)       key: (dep_no)
    R3 (emp_no, phone_no, proj_no)          key: (emp_no)
    R4 (mgr_em_no, dep_no)                  key: (mgr_em_no)
    R5 (phone_no, area, dep_no, office_no)  key: (phone_no)
    R6 (proj_no, dep_no, p_buject)          key: (proj_no)
    

    第三步删除包含在另一个中的关系:在这种情况下,关系 R4 包含在 R2 中,因此删除 R4。

    最后一步检查是否有任何关系包含原始关系的键之一,如果不是这样,则添加一个具有键之一的新关系:因为原始关系(仅)具有键(日期,emp_no),并且关系 R1 包含它,无需添加新关系。

    所以 3NF 如下:

    R1 (date, emp_no, job, salary)          key: (date, emp_no)
    R2 (dep_no, d_budget, mgr_emp_no)       keys: (dep_no), (mgr_em_no)
    R3 (emp_no, phone_no, proj_no)          key: (emp_no)
    R5 (phone_no, area, dep_no, office_no)  key: (phone_no)
    R6 (proj_no, dep_no, p_buject)          key: (proj_no)
    

    从这些关系中进行推理,您可以推断出每个关系所代表的实体以及指向其他关系的外键:

    R1 represents the history of jobs of the employee, with key: (date, emp_no),
        and emp_no as FK
    R2 represents a department, which is identified by dep_no but also by the number 
        of the manager (which is a FK for employees)
    R3 represents an employee, with key emp_no, with FKs phone_no and dep_no
    R5 represents the “place” of an employee, with key phone_no and FK dep_no
    R6 represents information about a project, with key proj_no and FK dep_no
    

    最后,请注意依赖项 4 和 5,即您称为“同一依赖项的多功能依赖项”,实际上是特殊的,因为它们在具有两个主键的关系(部门)中转换,部门和部门经理的编号。这是由第三步中的算法通过合并先前获得的两个关系来管理的(因此该关系具有两个主键)。

    • 1

相关问题

  • 函数依赖族的闭包 F 是什么?

  • 信息冗余和算法进行无损分解

  • 应用第二和第三范式

  • 为什么在 3NF 中有这种关系?

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    连接到 PostgreSQL 服务器:致命:主机没有 pg_hba.conf 条目

    • 12 个回答
  • Marko Smith

    如何让sqlplus的输出出现在一行中?

    • 3 个回答
  • Marko Smith

    选择具有最大日期或最晚日期的日期

    • 3 个回答
  • Marko Smith

    如何列出 PostgreSQL 中的所有模式?

    • 4 个回答
  • Marko Smith

    列出指定表的所有列

    • 5 个回答
  • Marko Smith

    如何在不修改我自己的 tnsnames.ora 的情况下使用 sqlplus 连接到位于另一台主机上的 Oracle 数据库

    • 4 个回答
  • Marko Smith

    你如何mysqldump特定的表?

    • 4 个回答
  • Marko Smith

    使用 psql 列出数据库权限

    • 10 个回答
  • Marko Smith

    如何从 PostgreSQL 中的选择查询中将值插入表中?

    • 4 个回答
  • Marko Smith

    如何使用 psql 列出所有数据库和表?

    • 7 个回答
  • Martin Hope
    Jin 连接到 PostgreSQL 服务器:致命:主机没有 pg_hba.conf 条目 2014-12-02 02:54:58 +0800 CST
  • Martin Hope
    Stéphane 如何列出 PostgreSQL 中的所有模式? 2013-04-16 11:19:16 +0800 CST
  • Martin Hope
    Mike Walsh 为什么事务日志不断增长或空间不足? 2012-12-05 18:11:22 +0800 CST
  • Martin Hope
    Stephane Rolland 列出指定表的所有列 2012-08-14 04:44:44 +0800 CST
  • Martin Hope
    haxney MySQL 能否合理地对数十亿行执行查询? 2012-07-03 11:36:13 +0800 CST
  • Martin Hope
    qazwsx 如何监控大型 .sql 文件的导入进度? 2012-05-03 08:54:41 +0800 CST
  • Martin Hope
    markdorison 你如何mysqldump特定的表? 2011-12-17 12:39:37 +0800 CST
  • Martin Hope
    Jonas 如何使用 psql 对 SQL 查询进行计时? 2011-06-04 02:22:54 +0800 CST
  • Martin Hope
    Jonas 如何从 PostgreSQL 中的选择查询中将值插入表中? 2011-05-28 00:33:05 +0800 CST
  • Martin Hope
    Jonas 如何使用 psql 列出所有数据库和表? 2011-02-18 00:45:49 +0800 CST

热门标签

sql-server mysql postgresql sql-server-2014 sql-server-2016 oracle sql-server-2008 database-design query-performance sql-server-2017

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve