我在数据库设计中有一些可传递的依赖项.我的上司告诉我,这些可能会导致错误.我发现很难找到资源来告诉我这些依赖关系是如何导致bug的.它们会造成什么样的问题?

我不是在质疑这个事实,我只是急于了解它们会造成什么样的问题.

编辑以了解更多详细信息:

维基百科:

传递依赖性

推荐答案

我举一个例子来说明:

-------------------------------------------------------------------
|  Course  |    Field     |   Instructor   |  Instructor Phone    |
-------------------------------------------------------------------
|  English |  Languages   |  John Doe      |     0123456789       |
|  French  |  Languages   |  John Doe      |     0123456789       |
|  Drawing |  Art         |  Alan Smith    |     9856321158       |
|  PHP     |  Programming |  Camella Ford  |     2225558887       |
|  C++     |  Programming |  Camella Ford  |     2225558887       |
-------------------------------------------------------------------
  • 如果你有一个Course,你可以很容易地得到它的Instructor所以Course->Instructor.
  • 如果你得了Instructor分,你就得不到他的Course分,因为他可能在教不同的课程.
  • 如果你有Instructor分,你可以很容易地得到他的Phone分,也就是Instructor->Phone分.

这意味着如果你有一个Course,那么你就可以得到Instructor Phone,也就是Course->Instructor Phone(即传递性依赖)

现在来看问题:

  1. 如果你同时删除了FrenchEnglish门课程,那么你也将删除他们的讲师John Doe,他的电话号码将永远丢失.
  2. 除非您先为他添加Course,否则无法将新的Instructor添加到您的数据库中,或者您可以复制Instructors table中的数据,这会更糟.
  3. 如果讲师John Doe更改了他的电话号码,那么你必须用新信息更新他教授的所有课程,这些信息很容易出错.
  4. 除非删除讲师教授的所有课程或将其所有字段设置为空,否则无法从数据库中删除讲师.
  5. 如果你决定保留导师的出生日期呢?您必须在Courses表中添加一个Birth Date字段.这听起来合乎逻辑吗?为什么首先要在课程表中保留讲师信息?

Database相关问答推荐

Kusto:从一个表中复制行并追加到同一集群中的另一个表中

如何在没有sqlmock的情况下模拟db ping

即使将enable_seqscan设置为关闭,也未使用数组列上的 GIN 索引?

数据库中的每个表都应该有一个 SQLiteOpenHelper 吗?

更新数据库后如何更新redis?

JOIN 三张表

哪个本地数据库适合 Windows 8 应用store 应用?

执行次数最多的存储过程?

本地数据库,我需要一些例子

什么是数据仓库?

在 SQL Server 中,如何以类似于 Oracle 的SELECT FOR UPDATE WAIT的方式锁定单行?

为什么在连接表上有一个主键不好?

在 Heroku 生产站点上清除 Rails 应用程序数据库

不带 WHERE 子句的 UPDATE 查询

数据库与微服务的一致性

MongoDB 是否支持浮点类型?

SQLite3 数据库的最大连接数是多少?

与内连接相反

什么是 ACID 的真实示例?

如何使用 liquibase,一个具体的例子