- 爱易网页
-
数据库教程
- 数据库正轨化和设计技巧(3)
日期:2013-06-14 浏览次数:20618 次
数据关系
在定义第四个正轨化的方式前,我想首先提一下三种基本的数据关系:一对一,一对多和多对多。我们回头看一下经过第一个正轨化的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_relationsswheresurl_relations.relatedUserId = 1 AND
users.userId = 1 AND urls.urlId = url_relations.relatedUrlId
如果我们想要遍历每团体的团体信息和url信息,我们可以这样做:
SELECT name, url FROM users, urls, url_relationsswheresusers.userId = url_relations.relatedUserId AND
urls.urlId = url_relations.relatedUrlId
第五级正轨化方式
还有一级正轨化的方式,它并不常见,有点深奥,并且在大部分的情况下都是不必要的。它的准绳是:
1.原来的表格必须可以通过由它分离出去的表格重新构建
使用这个规定的好处是,你可以确保不会在分离的表格中引入多余的列,所有你创建的表格结构都与它们的实际需求一样大。使用这条规定是一个好习惯,不过除非你要处理一个非常大型的数据,否则你将不需求用到它。
希望这篇文章对你有用,并且可以协助你在所有的项目中使用这些正轨化的规定。你可能想知道这些方法是从哪来的,我可以通知你,前面三个正轨化的规定是1972年,Dr. E.F. Codd在他的论文“进一步正轨化数据库的关系模型中”提出的,其余的规定是经过后来的集合理论和关系数学家理论化的。评论:正所谓物级必反,将表格分得过细有时并不好,由于这样需求将各表进行各种的关联,这会令查询时变得复杂,而且效率也可能降低,这些正轨化的规定可以参考,在实际使用时,要依据项目的大小,必要时可以进行一些测试,以设计出更合理的表格结构。
免责声明: 本文仅代表作者个人观点,与爱易网无关。其原创性以及文中陈述文字和内容未经本站证实,对本文以及其中全部或者部分内容、文字的真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。