数据库规范化和不同行中的重复值

Database normalization and repeated values in different rows

我认为我误以为数据库规范化的一部分是用 ID 号替换行中的重复值。考虑以下因素:

(employ table) 

id(pk   name    branch
-------------------------------
1       dan      nyc_union
2       ron      la_skidrow
3       seth     nyc_union

同一个分支可以出现多次,而且只有一个 nyc_union 分支,因此为了避免拼写错误(NYC、ny)和冗余,我们为分支创建了第二个 table 和 link 它与雇员有关系 table.

但是看了下面的https://www.studytonight.com/dbms/third-normal-form.php

如果您查看上面 link 中的 table 示例,为了满足规范化的第二条规则,他们使用 table 重复分支的值而不创建另一个 table,但他们声称它已标准化。我见过其他类似的例子。

如果我们在每个位置有多个分店,答案会改变吗?意思是现在我们可以把这个属性放在 employ 表中而不用创建另一个 table?

在哪些情况下我们有超过一列的实际值,而不是 link 到 id?

结论

作为遵循规范化的经验法则,我们应该只使用一个 'real non linked id value' 每个 table,其余值应该是 links 到其他 [=34] 中的 id =]秒。这个对吗?

规范化的关键点不是避免重复值:几个人可以有相同的名字,但这不是打破 names table 并用一个引用它的理由外键。

规范化在有另一列的地方发挥作用,例如

id   name    branch       address
---------------------------------
1    dan     nyc_union    1 Union Street
2    ron     la_skidrow   22 Skid Row
3    seth    nyc_union    1 Union Street

在这种情况下你有一个“功能依赖”,即分支的地址依赖于分支。也就是说,对于同一分支机构的任何两名员工,地址都是相同的。

为了规范化这个非规范化的 table,我们将 branchaddress 移动到它自己的 table 以 branch 作为主键并更改员工 table 到您问题中的员工,其中 branch 是我们新分支机构 table.

的外键

这有两个好处:

  • 不可能有人更新了一个员工记录中的地址,却忘记对该分支机构的所有其他员工执行相同的更新(这会导致不一致)。

  • 你不必一遍又一遍地存储相同的地址并保存一些space。