数据库正规化和设计技巧

bh1nfh

bh1nfh

2016-01-29 16:08

数据库正规化和设计技巧,数据库正规化和设计技巧
在动态网站的设计中,数据库设计的重要性不言而喻。如果设计不当,查询起来就非常吃力,程序的性能也会受到影响。无论你使用的是mySQL或者Oracle数据库,通过进行正规化的表格设计,可以令你的PHP代码更具可读性,更容易扩展,从而也会提升应用的性能。
简单说来,正规化就是在表格设计时,消除冗余性和不协调的从属关系。在本文中,我将通过五个渐进的过程来告诉你在设计中应该了解的正规化技巧。从而建立一个可行而且效率高的数据库。本文也会详细分析一下可以利用的关系类型。

这里假定我们要建立一个用户信息的表格,其中要存储用户的名字、公司、公司地址和一些个人的收藏夹或url。在开始时,你可能定义一个如下的表格结构:

零状态形式

users
name company company_address url1 url2
Joe ABC 1 Work Lane abc.com xyz.com
Jill XYZ 1 Job Street abc.com xyz.com


由于没有进行任何的正规化处理,我们将这种形式的表称为零状态形式的表。留意其中的url1和url2字段---如果我们在应用中需要第三个url呢?这样你就要在表格中多加一列,很明显,这不是一个好办法。如果你要创建一个富有扩展性的系统,你就要考虑使用第一个正规化的形式,并且应用到该表格中。

第一级正规化形式

1.消除每个表格中重复的组
2.为每套相关的数据建立一个独立的表格
3.使用一个主键来标识每套相关的数据

以上的表格明显违反了上面第一条的规定,那么第三条的主键又是什么意思呢?很简单,它只是在每个记录中加入一个唯一的、自动增加的整型值。通过这个值,就可以将两个姓名一样的记录区分开来。通过应用第一级正规化形式,我们得到了以下的表格:

users
userId name company company_address url
1 Joe ABC 1 Work Lane abc.com
1 Joe ABC 1 Work Lane xyz.com
2 Jill XYZ 1 Job Street abc.com
2 Jill XYZ 1 Job Street xyz.com

现在我们的表格可以说已经处在第一级正规化的形式了,它已经解决了url字段的限制问题,不过这样的处理后又带来了一个新的问题。每次在user表中插入一条记录的时候,我们都必须重复所有的公司和用户数据。这样不仅令数据库比以前大了,而且很容易出错。因此还要经过第二级正规化处理。
第二级正规化形式

1.为应用在多条记录的字段建立独立的表格
2.通过一个foreign key来关联这些表格的值

(本文来源于图老师网站,更多请访问https://m.tulaoshi.com/sqlserver/)

我们将url的值放在一个独立的表格中,这样我们就可以在以后加入更多的数据,而无需担心产生重复的值。我们还通过主键值来关联这些字段:

users
userId name company company_address
1 Joe ABC 1 Work Lane
2 Jill XYZ 1 Job Street

urls
urlId relUserId url
1 1 abc.com
2 1 xyz.com
3 2 abc.com
4 2 xyz.com

如上所示,我们创建了独立的表格,users表中的主键userid现在与url表中的foreign key relUserId关联。现在的情况好象已经得到了明显的改善。不过,如果我们要为ABC公司加入一个员工记录呢?或者更多,200个?这样我们就必须重复使用公司名和地址,这明显不够冗余。因此我们将应用第三级正规化方法:

第三级正规化形式

1.消除不依赖于该键的字段

公司名及地址与User Id都是没有关系的,因此它们应用拥有自己的公司Id:

(本文来源于图老师网站,更多请访问https://m.tulaoshi.com/sqlserver/)

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 relUserId url
1 1 abc.com
2 1 xyz.com
3 2 abc.com
4 2 xyz.com

这样我们就将companies表中的主键comId和users表中名字为relCompId的foreign key关联起来,就算为ABC公司加入200个员工,在companies中也只有一条记录。我们的users和urls表可以不断地扩大,而无需担心插入不必要的数据。大部分的开发者都认为经过三步的正规化就足够了,这个数据库的设计已经可以很方便地处理整个企业的负担,此看法在大多数的情况下是正确的。

我们可以留意一下url的字段--你注意到数据的冗余了吗?如果给用户用户输入这些url数据的HTML页面是一个文本框,可任意输入的话,这并没有问题,两个用户输入同样收藏夹的概率较少,不过,如果是通过一个下拉式的菜单,只让用户选择两个url输入,或者更多一点。这种情况下,我们的数据库还可以进行下一级别的优化--第四步,对于大多数的开发者来说,这一步都是忽略的,因为它要依赖一个很特别的关系--一个多对多的关系,这在我们的应用中是还没有遇到过的。
数据关系

在定义第四个正规化的形式前,我想首先提一下三种基本的数据关系:一对一,一对多和多对多。我们回头看一下经过第一个正规化的users表。要是我们将url的字段放在一个独立的表中,每次在users表中插入一个记录,我们就会在urls表中插入一行。我们将得到一个一对一的关系:用户表中的每一行,都将在urls表

展开更多 50%)
分享

猜你喜欢

数据库正规化和设计技巧

SQLServer
数据库正规化和设计技巧

数据库正规化和设计技巧(2)

SQLServer
数据库正规化和设计技巧(2)

s8lol主宰符文怎么配

英雄联盟 网络游戏
s8lol主宰符文怎么配

数据库正规化和设计技巧(1)

SQLServer
数据库正规化和设计技巧(1)

数据库正规化和设计技巧(3)

SQLServer
数据库正规化和设计技巧(3)

lol偷钱流符文搭配推荐

英雄联盟 网络游戏
lol偷钱流符文搭配推荐

数据库规范化技巧

编程语言 网络编程
数据库规范化技巧

数据库设计技巧(一)

PHP
数据库设计技巧(一)

lolAD刺客新符文搭配推荐

英雄联盟
lolAD刺客新符文搭配推荐

魔炫魅力:QQ2005 beta2新功能快速上手

魔炫魅力:QQ2005 beta2新功能快速上手

禁止别人使用QQ 四种方法禁用QQ

禁止别人使用QQ 四种方法禁用QQ
下拉加载更多内容 ↓