我有两个数据库表:
report(id,description)(key:id)和
registration(a,b,id_report)(key:(a,b));
id_report 是引用报告id的外键。
在表注册中有功能依赖 a -> id_report。
所以表注册是1nf而不是2nf。
尽管如此,我在表注册中找不到插入/更新/删除问题。是否可以?
谢谢
我有两个数据库表:
report(id,description)(key:id)和
registration(a,b,id_report)(key:(a,b));
id_report 是引用报告id的外键。
在表注册中有功能依赖 a -> id_report。
所以表注册是1nf而不是2nf。
尽管如此,我在表注册中找不到插入/更新/删除问题。是否可以?
谢谢
你在评论中说你无法“找出问题是如何发生的”。(强调了。)这里是如何。
假设您的表“注册”以这样的数据开始。
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。
可以对表进行非规范化,并且仍然没有任何现有的引用完整性问题。
规范化的原因是使创建插入、更新和删除异常变得更加困难或不可能。管理所有冗余数据以使其保持一致是可能的,但非常困难。
在 3NF(或更高,如果适用)中使用数据库仍然是一个更好的主意,这样您就不必依赖程序员和用户来避免麻烦。错误迟早会发生。