让我们谈谈数据库规范化。
您发现数据库模式的设计方式存在问题,主要是您将大量数据存储在多个位置。这很容易导致表彼此不同步、浪费存储空间和昂贵的查找。
让我告诉你我在说什么。
案例 1. 同步表。
假设您确实正确填充了 table_1、table_2。你会得到这样的东西:
table_1 table_2
ID_1 | name | email ID_2 | name | email
1 | bob | bob@cat.com 1 | adam | adam@dog.com
2 | adam | adam@dog.com 2 | bob | bob@cat.com
3 | bob | bob@dog.com 3 | bob | bob@dog.com
4 | joe | joe@dog.com
请注意,我将鲍勃的两封电子邮件存储了两次。这可能看起来不多,但如果 bob 有 5 封电子邮件,并且您添加了 table_3,那么您将存储 15 条记录以仅引用 5 条独特的信息。
现在假设您是 adam,并且您想要更新您的电子邮件,假设您想要将您的电子邮件更改为adam@cat.com
. 您在使用 的程序 1 中执行此table_1
操作,但您不在使用 的程序 2 中执行此操作table_2
。当你点击更新时你会得到什么?
table_1 table_2
ID_1 | name | email ID_2 | name | email
1 | bob | bob@cat.com 1 | adam | adam@dog.com
2 | adam | adam@cat.com 2 | bob | bob@cat.com
3 | bob | bob@dog.com 3 | bob | bob@dog.com
4 | joe | joe@dog.com
Adam 现在有不同的电子邮件,具体取决于他使用的是程序 1 还是程序 2。因此,要解决此问题,每次更改 table_1 中的内容时都需要通过 table_2,这是一个额外的数据库调用。
案例 2. 内部一致性
现在让我们说鲍勃想把他的名字改成吉尔。现在会发生什么?
table_1 table_2
ID_1 | name | email ID_2 | name | email
1 | jill | bob@cat.com 1 | adam | adam@dog.com
2 | adam | adam@dog.com 2 | bob | bob@cat.com
3 | bob | bob@dog.com 3 | bob | bob@dog.com
4 | joe | joe@dog.com
糟糕,我不小心只更新了表 1 中 bob 对应的一行,现在看来 bob@cat.com 和 bob@dog.com 是两个不同的人,但实际上它们是相同的。所以我必须遍历整个数据库并检查每一行的name = "bob"
. 然后我必须对 table_2 做同样的事情。您的数据库正在迅速变得难以管理。
数据库规范化
而不是有两张桌子。
table_1 table_2
ID_1 | name | email ID_2 | name | email
1 | bob | bob@cat.com 1 | adam | adam@dog.com
2 | adam | adam@dog.com 2 | bob | bob@cat.com
3 | bob | bob@dog.com 3 | bob | bob@dog.com
4 | joe | joe@dog.com
取两个表共有的信息,即姓名-电子邮件对,并将其放入用户表中
table_1 table_2 user
ID_1 | userId ID_2 | userId userId | name | email
1 | 2 1 | 1 1 | adam | adam@dog.com
2 | 1 2 | 2 2 | bob | bob@cat.com
3 | 2 3 | 2 2 | bob | bob@dog.com
4 | 3 3 | joe | joe@dog.com
这解决了很多问题,现在当您想要查找用户的姓名/电子邮件时,您可以根据 userId 在用户表中查找它。如果 adam 更改了他的电子邮件,则两个表都会更改(因为它们都引用了 user 表)。
还有一件事,如果 bob 更改了他的名字,我们不应该查看整个用户表来更改他的名字的每个场合。所以我们可以更进一步。
table_1 table_2 user email
ID_1 | userId ID_2 | userId userId | name userId | email
1 | 2 1 | 1 1 | adam 1 | adam@dog.com
2 | 1 2 | 2 2 | bob 2 | bob@cat.com
3 | 2 3 | 2 3 | joe 2 | bob@dog.com
4 | 3 3 | joe@dog.com
现在我们没有多余的信息,不需要重复值,并且任何地方的更改都会影响引用它的所有其他表。