【问题标题】:Update problems with 1nf database tables更新 1nf 数据库表的问题
【发布时间】:2012-12-08 11:27:31
【问题描述】:

我有两个数据库表:
report(id, description) (key: id) 和
注册ab、id_report)(键:(ab)) ;

id_report 是引用报告 id 的外键。
在表 registration 中有函数依赖 a -> id_report。

所以表 registration 是 1nf 而不是 2nf。

尽管如此,我在表注册中找不到插入/更新/删除问题。有可能吗?

谢谢

【问题讨论】:

  • 您找不到问题可能是如何发生的,或者您找不到实际存在的问题?
  • 我找不到问题是如何发生的。

标签: database foreign-keys relational-database database-normalization third-normal-form


【解决方案1】:

您在评论中说您无法“找出问题可能是如何发生的。” (添加了重点。)方法如下。

假设您的表“注册”以这样的数据开始。

a  b    id_report
--
1  10   13
1  11   13
1  12   13 
2  27   14
2  33   14

函数依赖 a->id_report 仍然成立。当我们知道“a”的值时,我们会发现“id_report”的值只有一个。

但是 dbms 不能直接强制执行这种依赖关系。 意味着 dbms 将允许此更新语句运行而不会出错。

update registration
set id_report = 15
where a = 1 and b = 10;

a  b    id_report
--
1  10   15
1  11   13
1  12   13 
2  27   14
2  33   14

现在您的数据已损坏。当我们知道“a”的值时,我们现在找到“id_report”的两个值。在前面的表中,知道“a”等于 1 意味着我们知道“id_report”等于 13。我们不再知道;如果 "a" 等于 1,则 id_report 可能是 13 或 15。

【讨论】:

    【解决方案2】:

    可以对表进行非规范化,但仍然没有任何现有的参照完整性问题。

    规范化的原因是为了让创建插入、更新和删除异常变得更加困难或不可能。管理所有冗余数据以使其保持一致是可能的,但非常困难。

    使用 3NF(或更高版本,如果适用)的数据库仍然是一个更好的主意,这样您就不必依赖程序员和用户来避免麻烦。错误迟早会发生。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-01-29
      • 2015-11-25
      • 2011-12-03
      • 2012-12-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-01-06
      相关资源
      最近更新 更多