专注于互联网--专注于架构

最新标签
网站地图
文章索引
Rss订阅

首页 »数据库 » 数据库技巧:数据库正规化和设计窍门技巧 »正文

数据库技巧:数据库正规化和设计窍门技巧

来源: 发布时间:星期二, 2008年12月23日 浏览:87次 评论:0
在动态网站WebSite设计中数据库设计重要性不言而喻如果设计不当,查询起来就非常吃力性能也会受到影响无论你使用是mySQL或者Oracle数据库通过进行正规化表格设计可以令你PHP代码更具可读性更容易扩展从而也会提升应用性能
  简单说来正规化就是在表格设计时消除冗余性和不协调从属关系在本文中我将通过 5个渐进过程来告诉你在设计中应该了解正规化窍门技巧从而建立个可行而且效率高数据库本文也会详细分析下可以利用关系类型
  这里假定我们要建立个用户信息表格其中要存储用户名字、公司、公司地址和些个人收藏夹或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字段---如果我们在应用中需要第 3个url呢?这样你就要在表格中多加很明显这不是个好办法如果你要创建个富有扩展性系统你就要考虑使用第个正规化形式并且应用到该表格中
级正规化形式
1.消除每个表格中重复
2.为每套相关数据建立个独立表格
3.使用个主键来标识每套相关数据
  以上表格明显违反了上面第规定那么第 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表中插入条记录时候我们都必须重复所有公司和用户数据这样不仅令数据库比以前大了而且很容易出错因此还要经过第 2级正规化处理
第 2级正规化形式
1.为应用在多条记录字段建立独立表格
2.通过个foreign key来关联这些表格
  我们将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个?这样我们就必须重复使用公司名和地址这明显不够冗余因此我们将应用第 3级正规化思路方法:
第 3级正规化形式
1.消除不依赖于该键字段
公司名及地址和User Id都是没有关系因此它们应用拥有自己公司Id:
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表中名字为relCompIdforeign key关联起来就算为ABC公司加入200个员工在companies中也只有条记录我们users和urls表可以不断地扩大而无需担心插入不必要数据大部分开发者都认为经过 3步正规化就足够了这个数据库设计已经可以很方便地处理整个企业负担此看法在大多数情况下是正确
  我们可以留意下url字段--你注意到数据冗余了吗?如果给用户用户输入这些url数据HTML页面是个文本框可任意输入这并没有问题两个用户输入同样收藏夹概率较少不过如果是通过个下拉式菜单只让用户选择两个url输入或者更多这种情况下我们数据库还可以进行下级别优化--第 4步对于大多数开发者来说步都是忽略它要依赖个很特别关系--个多对多关系这在我们应用中是还没有遇到过
数据关系
  在定义第 4个正规化形式前我想首先提下 3种基本数据关系:对多和多对多我们回头看下经过第个正规化users表要是我们将url字段放在个独立表中每次在users表中插入个记录我们就会在urls表中插入我们将得到关系:用户表中都将在urls表中找到相应对于我们应用来说这既不实用也不标准
  然后看看第 2个正规化例子对于每个用户记录我们表格允许有多个urls记录和的关联这是对多关系这是个很常见关系
  对于多对多关系来说就有点复杂了在我们第 3个正规化形式例子中我们个用户和很多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

  为了进步减低数据冗余我们运用第 4级正规化形式我们创建了个颇奇怪url_relations表里面字段均为主键或者foreign key通过这个表我们就可以消除urls表中重复项目以下是第 4个正规化形式具体要求:
第 4个正规化形式
1.在个多对多关系中独立实体不能存放在同个表格中
  由于它仅应用于多对多关系因此大多数开发者可以忽略这条规定不过在某些情况下它是非常实用这个例子就是这样我们通过将相同实体分离出来并且将关系移到它们自己表格中从而改进了urls表格
为了令你更容易明白我们举个具体例子以下将用个SQL语句选择出所有属于joeurls:
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
第 5级正规化形式
还有级正规化形式它并不常见有点深奥并且在大部分情况下都是不必要原则是:
1.原来表格必须可以通过由它分离出去表格重新构建
  使用这个规定好处是你可以确保不会在分离表格中引入多余所有你创建表格结构都和它们实际需要样大应用这条规定是个好习惯不过除非你要处理个非常大型数据否则你将不需要用到它
  希望这篇文章对你有用并且可以帮助你在所有项目中应用这些正规化规定你可能想知道这些思路方法是从哪来我可以告诉你前面 3个正规化规定是1972年Dr. E.F. Codd在他论文“进步正规化数据库关系模型中”提出其余规定是经过后来集合理论和关系数学家理论化 评论:正所谓物级必反将表格分得过细有时并不好这样需要将各表进行各种关联这会令查询时变得复杂而且效率也可能降低这些正规化规定可以参考在实际应用时要根据项目大小必要时可以进行些测试以设计出更合理表格结构
0

相关文章

读者评论

发表评论

  • 昵称:
  • 内容: