更新1nf数据库表的问题

时间:2012-12-08 11:27:32

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

我有两个数据库表:
报告 ID ,说明)(键: ID )和
注册 a b ,id_report)(关键字:( a b ));

id_report是引用报告 id 的外键 在表 registration 中,存在功能依赖性a - > id_report。

因此表注册是1nf但不是2nf。

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

由于

2 个答案:

答案 0 :(得分: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。

答案 1 :(得分:0)

表可以非规范化,但仍然没有任何现有的引用完整性问题。

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

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