依睛(IT blog) 我回来了,PHP<-->C/C++ LINUX
笨鸟
导航
IT博客
首页
新随笔
联系
聚合
管理
<
2009年1月
>
日
一
二
三
四
五
六
28
29
30
31
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
1
2
3
4
5
6
7
留言簿
(26)
给我留言
查看公开留言
查看私人留言
随笔分类
(315)
嵌入式开发ARM(1)
(rss)
???问的睛(8)
(rss)
C/C++学习资料库(169)
(rss)
Linux 学习库(69)
(rss)
UNIX(6)
(rss)
UNIX高级环境编程(3)
(rss)
VXworks资料(3)
(rss)
大补英语(3)
(rss)
学习资料库(14)
(rss)
日语学习(2)
(rss)
生活日记(26)
(rss)
电子与通信技术(专业)(1)
(rss)
看看就行的资料(3)
(rss)
精巧小例子(谁都知)(2)
(rss)
网站资料库(3)
(rss)
面试题目收集 (2)
(rss)
文章分类
(5)
转(感处和理论)(5)
(rss)
收藏夹
UNIX 高级环境编程
(rss)
随笔档案
(330)
2009年11月 (3)
2009年2月 (32)
2009年1月 (28)
2008年12月 (42)
2008年11月 (16)
2008年10月 (18)
2008年9月 (20)
2008年7月 (1)
2008年5月 (1)
2008年3月 (2)
2008年2月 (9)
2008年1月 (35)
2007年12月 (4)
2007年11月 (1)
2007年10月 (8)
2007年9月 (23)
2007年8月 (31)
2007年7月 (12)
2007年6月 (20)
2007年5月 (10)
2007年4月 (14)
文章档案
(11)
2008年2月 (2)
2007年10月 (1)
2007年6月 (1)
2007年4月 (7)
相册
大学生活照(南京)
大学相册
志文相册
阅读排行榜
1. fstat、stat和lstat 区别(转)(38413)
2. fscanf和fprintf 的详细用法 (19622)
3. freopen (stdin stdout ) 详解+实例(12590)
4. 文件操作 FILE结构体(C语言版) (11243)
5. ioctlsocket(s, FIONBIO, &ulBlocking(8798)
评论排行榜
1. VxWorks 操作系统学习笔记(20)
2. 值和传引用、传地址的区别是什么?(15)
3. linux 用法(10)
4. 想有个家(9)
5. 编程导学之C/C++中命令行参数的原理(8)
统计
随笔 - 330
文章 - 11
评论 - 151
引用 - 0
积分与排名
积分 - 382624
排名 - 11
友情连接
小刺猬 (左手程序,右手妻)
$$Am 11:11 迷失
『 天道酬勤 』
AIX and UNIX
Andy's Redemption
CHENG XU
IBM developerWorks IBM
Javascript研究
jesse (常用)
Linux笔记
Mythma‘s C++ blog
Top大杂烩
任我行
叮叮咚咚XYZ(
好好喔~~
嵌入式
嵌入式,GoodLucky...... (LINUX 全部实例子 )
樊奇 Xseries eServer 工程师, IBM TSS China Beijing
江湖·郎中·路
源码工作室
耗子的一亩三分自留地
飞翔,嵌入式linux
最新评论
1. re: snprintf/_snprintf 在不同平台间函数差异
更坑爹的是n系列函数在处理utf8编码字符串时的表现,根本无法正常工作
--路人乙
2. re: 用mmap()共享内存(转)
会提示如下错误:
Bus error (core dumped)
--zsf
3. re: 移植嵌入式Linux到ARM处理器:基本概念(1)
楼主继续填坑啊
--后续呢
4. re: 0xffffffff
0xFFFFFFFF这个是-1, 0xFFFFFFF是int型最大值对吧。
--路人甲
5. re: "bps"是什么单位?是什么意思?
..................
--..
数据库正规化和设计技巧
数据库正规化和设计技巧
作者:浩瀚天涯 来源: 发布日期:2007-04-19
在动态网站的设计中,数据库设计的重要性不言而喻。如果设计不当,查询起来就非常吃力,程序的性能也会受到影响。无论你使用的是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来关联这些表格的值
我们将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 keyrelUserId关联。现在的情况好象已经得到了明显的改善。不过,如果我们要为ABC公司加入一个员工记录呢?或者更多,200个?这样我们就必须重复使用公司名和地址,这明显不够冗余。因此我们将应用第三级正规化方法:
第三级正规化形式
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表中名字为relCompId的foreignkey关联起来,就算为ABC公司加入200个员工,在companies中也只有一条记录。我们的users和urls表可以不断地扩大,而无需担心插入不必要的数据。大部分的开发者都认为经过三步的正规化就足够了,这个数据库的设计已经可以很方便地处理整个企业的负担,此看法在大多数的情况下是正确的。
我们可以留意一下url的字段--你注意到数据的冗余了吗?如果给用户用户输入这些url数据的HTML页面是一个文本框,可任意输入的话,这并没有问题,两个用户输入同样收藏夹的概率较少,不过,如果是通过一个下拉式的菜单,只让用户选择两个url输入,或者更多一点。这种情况下,我们的数据库还可以进行下一级别的优化--第四步,对于大多数的开发者来说,这一步都是忽略的,因为它要依赖一个很特别的关系--一个多对多的关系,这在我们的应用中是还没有遇到过的。 数据关系
在定义第四个正规化的形式前,我想首先提一下三种基本的数据关系:一对一,一对多和多对多。我们回头看一下经过第一个正规化的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
第五级正规化形式
还有一级正规化的形式,它并不常见,有点深奥,并且在大部分的情况下都是不必要的。它的原则是:
1.原来的表格必须可以通过由它分离出去的表格重新构建
使用这个规定的好处是,你可以确保不会在分离的表格中引入多余的列,所有你创建的表格结构都与它们的实际需要一样大。应用这条规定是一个好习惯,不过除非你要处理一个非常大型的数据,否则你将不需要用到它。
希望这篇文章对你有用,并且可以帮助你在所有的项目中应用这些正规化的规定。你可能想知道这些方法是从哪来的,我可以告诉你,前面三个正规化的规定是1972年,Dr. E.F. Codd在他的论文“进一步正规化数据库的关系模型中”提出的,其余的规定是经过后来的集合理论和关系数学家理论化的。评论:正所谓物级必反,将表格分得过细有时并不好,因为这样需要将各表进行各种的关联,这会令查询时变得复杂,而且效率也可能降低,这些正规化的规定可以参考,在实际应用时,要根据项目的大小,必要时可以进行一些测试,以设计出更合理的表格结构。
0
顶一下
posted on 2009-01-03 16:49
向左向右走
阅读(68)
评论(0)
编辑
收藏
引用
只有注册用户
登录
后才能发表评论。
Powered by:
IT博客
Copyright © 向左向右走