我有两个数据库表:
报告( ID ,说明)(键: ID )和
注册( a , b ,id_report)(关键字:( a , b ));
id_report是引用报告 id 的外键 在表 registration 中,存在功能依赖性a - > id_report。
因此表注册是1nf但不是2nf。
尽管如此,我在表注册中找不到插入/更新/删除问题。有可能吗?
由于
答案 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(或更高版本,如果适用)中使用数据库仍然是一个更好的主意,这样您就不会依赖程序员和用户来避免麻烦。迟早会出现错误。