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 / 问题 / 136946
Accepted
Revolucion for Monica
Revolucion for Monica
Asked: 2016-04-30 00:40:02 +0800 CST2016-04-30 00:40:02 +0800 CST 2016-04-30 00:40:02 +0800 CST

Boyce-Codd范式中的分解可能会失去关系?

  • 772

让以下R={UtilisateurID, Nom, Prenom, AdresseEmail, Login, Passwd, ServeurMail}具有功能依赖关系的 Realtion:

F = { UtilisateurID → Nom, Prenom
      UtilisateurID, ServeurMail → Login, Passwd;
      AdresseEmail → UtilisateurID;
      AdresseEmail → ServeurEmail;
} 

什么是最小键?

我说这是K = { AdresseEmail }它给其他人的。

为了把它放在 BCNF 中,我有以下算法

We take X→A from F

We create R¹(X,A)

F¹={X → A} R¹ BCNF

    R²=R-{A}

        E¹:F²=FD from F except those that affect A.

        E²: IF R² is BCNF → END

        ELSE We decompose R2 returning to E¹

所以我做了:

R 不是 BCNF 因为没有 FD 看起来像key → attribute ¬key

R¹={AdresseEmail, ServeurEmail}

E1: F¹={AdresseEmail  → ServeurEmail}

R²=(UtilisateurID, Nom, Prenom, AdresseEmail, Login, Passwd)

F²=(UtilisateurID  → Nom, Prenom

    AdresseEmail → UtilisateurID

   )

所以我的 BCNF 分解实际上是:

R¹=(AdresseEmail, ServeurMail)和

R²=(UtilisateurID, Nom, Prenom, AdresseEmail, Login, Passwd).

但是我们输了AdresseMail → ServeurEmail

这不是微不足道的,X 是一个(sur)键并且 A 没有键属性因此它是 BCNF。

我的分解对吗?我在设计密钥时是否犯了错误?

database-design normalization
  • 1 1 个回答
  • 374 Views

1 个回答

  • Voted
  1. Best Answer
    Renzo
    2016-05-01T09:26:24+08:002016-05-01T09:26:24+08:00

    您的分解不正确,因为在 R2 中您仍然有违反 BCNF 的依赖项,例如UtilisateurID → Nom(UtilisateurID不是该关系的关键)。

    问题是你的算法不正确。当您发现违反 BCNF 的依赖关系X → A时,您应该将关系分解为两个关系,第一个关系是 X +而不是 XA,第二个关系是 T – X + + X。然后您应该重复该算法,如果您发现在两个分解关系之一中,一些其他依赖项违反了 BCNF。

    因此,在您的示例中,正确的分解是:

    R2 < (AdresseEmail ServeurMail UtilisateurID) ,
    { AdresseEmail → UtilisateurID
    AdresseEmail → ServeurMail } >
    
    R3 < (Nom Prenom UtilisateurID) ,
    { UtilisateurID → Nom
    UtilisateurID → Prenom } >
    
    R4 < (Login Passwd ServeurMail UtilisateurID) ,
    { ServeurMail UtilisateurID → Login
    ServeurMail UtilisateurID → Passwd } >
    

    请注意,此分解保留了功能依赖性。

    添加

    分解是如何得到的?从原始关系开始:

    R(AdresseEmail Login Nom Passwd Prenom ServeurMail UtilisateurID)
    

    让我们考虑一个确实违反 BCNF 的依赖项,例如:

    ServeurMail UtilisateurID → Login
    

    的闭包ServeurMail UtilisateurID是(Login Nom Passwd Prenom ServeurMail UtilisateurID,所以我们最初分解为两个关系:

    R1(Login Nom Passwd Prenom ServeurMail UtilisateurID) 
    R2(AdresseEmail ServeurMail UtilisateurID)
    

    R1 不在 BCNF 中,因为键是ServeurMail UtilisateurID,因此依赖关系UtilisateurID → Nom违反了范式。应用该算法,R1 分解为:

    R3(Nom Prenom UtilisateurID)
    R4(Login Passwd ServeurMail UtilisateurID)
    

    两种关系都在 BCNF 中,最终分解由 R2、R3 和 R4 给出。

    最后,请注意,有时算法会产生不同的解决方案,具体取决于在每个步骤中选择的功能依赖性。

    • 4

相关问题

  • 存储计算值或根据要求重新计算它们更好吗?[复制]

  • 存储与计算聚合值

  • 在数据仓库中实现多对多关系有哪些方法?

  • 高级规范化形式是否总是符合低级规范化形式的标准?

  • 标准化练习资源

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