数据库设计四五范式

作者:袖梨 2022-06-30
在定义第四个正规化的形式前,我想首先提一下三种基本的数据关系:一对一,一对多和多对多。我们回头看一下经过第一个正规化的users 表。要是我们将url 的字段放在一个独立的表中,每次在users 表中插入一个记录,我们就会在urls 表中插入一行。我们将得到一个一对一的关系:用户表中的每一行,都将在urls 表中找到相应的一行。对于我们的应用来说,这既不实用也不标准。
然后看看第二个正规化的例子。对于每个用户记录,我们的表格允许有多个urls 的记录与之关联。这是一个一对多的关系,这是一个很常见的关系。
对于多对多的关系来说,就有点复杂了。在我们的第三个正规化形式的例子中,我们的一个用户与很多的url 有关,而我们想将该结构变为允许多个用户与多个的urls 有关,这样我们就可以得到一个多对多的结构。在讨论前,我们先看看表格结构会有些什么变化
users
userId name relCompId
1 Joe 1
2 Jill 2
companies
compId company company_address
1 ABC 1 Work Lane
2 XYZ 1 Job Street
urls
urlId url
1 abc.com
2 xyz.com
url_relations
relationId relatedUrlId relatedUserId
1 1 1
2 1 2
3 2 1
4 2 2
为了进一步减低数据的冗余,我们运用第四级正规化形式。我们创建了一个颇奇怪的url_relations 表,里面的字段均为主键或者foreign key 。通过这个表,我们就可以消除urls 表中的重复项目。以下是第四个正规化形式的具体要求:
第四个正规化形式
1. 在一个多对多的关系中,独立的实体不能存放在同一个表格中
由于它仅应用于多对多的关系,因此大多数的开发者可以忽略这条规定。不过在某些情况下,它是非常实用的,这个例子就是这样,我们通过将相同的实体分离出来,并且将关系移到它们自己的表格中,从而改进了urls 表格。
为了令你更容易明白,我们举个具体的例子,以下将用一个SQL 语句选择出所有属于joe 的urls :
SELECT name, url
FROM users, urls, url_relations
Where url_relations.relatedUserId = 1 AND users.userId = 1 AND urls.urlId = url_relations.relatedUrlId
如果我们想要遍历每个人的个人信息和url 信息,我们可以这样做:
SELECT name, url
FROM users, urls, url_relations
Where users.userId = url_relations.relatedUserId AND urls.urlId = url_relations.relatedUrlId

相关文章

精彩推荐