0

我有两个数据库表:
reportid,description)(key:id)和
registrationab,id_report)(key:(ab));

id_report 是引用报告id的外键。
在表注册中有功能依赖 a -> id_report。

所以表注册是1nf而不是2nf。

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

谢谢

4

2 回答 2

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。

于 2012-12-08T18:13:55.420 回答
0

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

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

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

于 2012-12-08T12:52:17.423 回答