细说数据库范式

理论性的东西,往往容易把人人都看得懂的东西写成连鬼都看不懂,近似于主任医生开的药方。从前学范式的时候,把书中得概念翻来覆去看,看得痛心疾首深恶痛绝,再加上老师深切误导,最后一塌糊涂。借助网络资源,自己写了一篇,自己是看懂了,希望对大家也有所帮助,有错误帮忙指正。

 

数据库范式(Normal forms):是用于规范关系型数据库设计,以减少谬误发生的一种准则。

 

1NF(first normal form)

Table faithfully represents a relation and has no repeating groups.

数据库表必须如实地展现“关系”,并且不允许有“重复组”出现。

 

这样的概念真是令人痛心疾首,我们只好再搬出1NF的的作者之一Chris Date的解释:

1. There's no top-to-bottom ordering to the rows.

(任意两行没有特定的顺序关系。不存在一个特定的理由要某一行必须在另一行之前。)

2. There's no left-to-right ordering to the columns.

(任意两列没有特定的顺序关系。)

3. There are no duplicate rows.

(不允许存在重复的行。如果一张表没有Unique Key,事实上它是违反1NF。)

4. Every row-and-column intersection contains exactly one value from the applicable domain (and nothing else).

(不允许出现空值Null,这一点不同作者是有争议的。事实上我们常常违背这点。)

5. All columns are regular [i.e. rows have no hidden components such as row IDs, object IDs, or hidden timestamps].

(不允许存在隐藏字段。不知道OracleRowid属不属于这个?)

 

有人从第四点的“one value”大肆挖掘,于是我们就见到了书上这样的定义:“如果一个关系模式R的所有属性都是原子的,即不可再分的基本数据项,则RÎ1NF”。

 

这一点被认为是1NF的核心,“关系模式R“表”,“属性” “列”,下面是一种与1NF不一致的情况,通常这是一类很明显的设计缺陷:

ID

Artist

FavoriteColor

……

1

Babyface

Blue,Yellow

……

2

Sting

Green

……

 

对上例我们不能把它拆分成FavoriteColor1FavoriteColor2……因为首先我们不能确定该拆分成几列;其次FavoriteColor1FavoriteColor2在结构、含意方面都是相同的,这实际上也是一类“repeating group”;同时这种设计会导致某些查询困难,比如“有哪些艺人喜欢黄色?”

 

解决方案是将表拆分成两个:

ID

Artist

……

1

Babyface

……

2

Sting

……

 

ID

FavoriteColor

1

Blue

1

Yellow

2

Green

 

总结:

1NF最核心的 “原子性”,违反此规范的可能性:接近于0%。不过,网上很多帖子说在关系型数据库中根本不可能违背1NF,我认为这是不对的。

 

 

2NF(second normal form):

No non-prime attribute in the table is functionally dependent on a part (proper subset) of a candidate key.

不存在非主属性对任一候选键的部分函数依赖。

 

如果解释完下面几个概念,这个定义就可以读懂了:

Superkey:超级键(L,如果属性或属性组合能唯一标识一条记录,则它是一个Superkey

Candidate key:候选键,当Superkey只包含一个属性时,则它是一个候选键;当Superkey包含一组属性时,仅当这一组属性不包含另一Superkey时,它是一个候选键。换句话说,候选键是“纯净的”、最小化的Superkey

Non-prime attribute:非主属性,未在任何候选键中出现的属性,即为非主属性。

 

举例来说,对表{First_name,Last_name,Address},假定全名不重复,则:

Superkey

{First_name,Last_name}

{First_name,Last_name,Address}

Candidate key:

{First_name,Last_name}

Non-prime attribute

Address

 

浅白版:“2NF针对的是复合候选键(即键包含的字段个数>1)的情况,非主属性不能只依赖于复合候选键中的一部分字段。”显然,如果是非复合候选键,如果它符合1NF,那么它一定符合2NF

 

假设有这样一张涉及艺人与唱片公司的关系表:

Artist

艺人

Company

唱片公司

DurationYears

签约总年数

CompAddr

公司住址

Babyface

Solar

4

Indiana

Babyface

Laface

2

Indiana

 

 

 

 

显然,{Artist,Company}为可以作为一个候选键,DurationYears在这没有问题,但CompAddr是违反2NF的,它只依赖于候选键的一部分(依赖于Company),这是违反2NF的,为了消除这种情况,我们可以:

Artist

艺人

CompID

唱片公司

DurationYears

签约总年数

Babyface

1

4

Babyface

2

2

 

ID

Company

唱片公司

CompAddr

公司住址

1

Solar

Indiana

2

Laface

Indiana

 

总结:

对于2NF,如果关系中的候选键只包含一个属性,可以直接略过。

 

在考虑2NF的过程中,不要把几个无关的实体的属性杂揉放在一个关系中,比如Artist是一个实体、Company是一个实体,它们可以有一系列的关联表(也是实体),但在关联表中尽量不要引入前两个实体的无关属性。

 

 

3NF(Third normal form)

Every non-prime attribute is non-transitively dependent on every key of the table.

不存在非主属性对任一键(候选键)的传递依赖。

 

传递依赖,你可以顾名思义,这里就不再引入定义了,举个例子,有下面一张表:

Tournament

赛事

Year

年份

Winner

冠军

Winner Date of Birth

冠军生日

Indiana Invitational

1998

Al Fredrickson

21 July 1975

Cleveland Open

1999

Bob Albertson

28 September 1968

Des Moines Masters

1999

Al Fredrickson

21 July 1975

Indiana Invitational

1999

Chip Masterson

14 March 1977

 

这里的候选键为{Tournament,Year},显然有这样的决定关系:

{Tournament,Year}→Winner

{Tournament,Year}→Winner→Winner Date of Birth

其中第二条就属于违反3NF的情况,因为Winner Date of Birth依赖于Winner而不是直接依赖于候选键。这种情况下,可以将Winner,Winner Date of Birth单独作为一张表,这里不赘述。

 

总结:

我觉得大多数人凭借直观感觉,就可使设计的关系符合3NF,所以这些理论,你只需要姑且读之。

 

 

BCNF(Boyce-Codd normal form)BoyceCodd是该范式的两名作者。)

Every non-trivial functional dependency in the table is a dependency on a superkey.

表中的任何非平凡函数依赖,都必须是对superkey的依赖。

 

non-trivial functional dependency:非平凡函数依赖,如果存在一个决定关系xy,且y并非x的子集,则叫着y非平凡函数依赖于x

 

BCNF3NF的最大区别是它并不仅针对非主属性(non-prime attribute)来说,它发生的时候常常是表中根本不存在非主属性,以至于它不可能违反2NF3NF。而BCNF的出现就是为了扩大“打击面”。

 

于是BCNF的主旨是:补充对发生在主属性(prime attribute)身上的函数依赖的约束,因为对于非主属性的约束已经在3NF中完成了。

 

例子,使用关系表描述学生、课程、教师的关系(假定一名教师只负责一门课程,一门课程则可以由多位教师负责):

Student

学生

Course

课程

Teacher

教师

S1

C1

T1

S1

C2

T2

S2

C1

T1

S2

C2

T3

S2

C3

T2

候选键:

{Student,Course}

{Student,Teacher}

因此这里不存在非主属性,而在主属性的函数依赖中,存在Teacher→Course,这属于违反BCNF的情况。

 

可是,问题是这个表看起来还挺正常的啊?!它的毛病在于,我们无法阻止类似最后一行这样的数据插入,而这会导致与前提“一名教师只负责一门课程”违背。所以我们还是需要将它拆分:

Student

学生

Teacher

教师

S1

T1

S1

T2

S2

T1

S2

T3

 

Teacher

教师

Course

课程

T1

C1

T2

C2

T3

C2

这样,在“Teacher-Course”表中,借助主键的帮助,最后可以避免违背“一名教师只负责一门课程”这个前提。

 

那么,如果没有这样一个前提,是初的设计是否符合BCNF?目前看来是的。

 

真实的情况可能更为复杂,下面这个更接近于我的一些经历:

1)学生需要学习多门课程

2)一门课程可能有多位教师负责

3)一位教师可能负责多门课程

4)某一班级的某一课程对应的教师是固定的(一位)

据此,为了描述学生、课程、教师三者的关系,从这一团乱麻中最早跳出来的大概是这样的表:

Student

学生

Class

班级

Course

课程

Teacher

教师

 

 

 

 

 

 

 

 

 

候选键:

{Student,Course}

我们可以明显地看到StudentClass违反了2NF,于是:

Student

学生

Class

班级

 

 

 

 

 

Class

班级

Course

课程

Teacher

教师

 

 

 

 

 

 

 

从这两张表,仔细考虑,即便我们通过Class关联两张表,还是无法得出学生与课程的关系(只能得出可供该学生选择的课程),所以我们需要再添加一张表:

Student

学生

Course

课程

 

 

 

 

 

最后大概是这么三张表,可能还有其它的方案,这里只是举例说明,就不纠缠了。

 

BCNF之后,还有4NF5NFDKNF6NF,等什么时候有空了再看看是什么东东。

 

Tag标签: 范式,1nf,2nf,3nf,bcnf
10
0
(请您对文章做出评价)
« 上一篇:C#小Tip:Xml操作简明手册
» 下一篇:.NET应用程序的本地化及RESGEN.exe, AL.exe介绍
posted @ 2009-10-26 15:55 SnowToday 阅读(1477) 评论(28)  编辑 收藏 网摘 所属分类: Database

  回复  引用  查看    
#1楼2009-10-26 16:11 | winter-cn      
楼主讲的很清晰啊 看了楼主的解释 我觉得一直以来我看到的一些书上对1NF的解释有些问题。

另 DKNF和6NF是一回事 貌似资料非常少 期待楼主后文

  回复  引用  查看    
#2楼2009-10-26 16:36 | Ivony...      
关系型数据规范化,是在复杂的数据库中消除数据冗余的方式。而这些范式则是让我们发现数据库中存在冗余的工具。消除冗余到什么程度,或者说该不该消除冗余,这不是范式可以解答的。


关于一二三范式,其定义都是非常明确而简单的,都是一些看起来很深奥的理论和名词使得它们看起来很复杂。


运用范式的关键在于你是不是能找出键和依赖关系。你找得出,什么范式都不会也能消除冗余。找不出,把范式背的烂熟也无助于你消除冗余。

  回复  引用    
#3楼2009-10-26 16:43 | cocobear[未注册用户]
2楼的说的很好, 也顶下楼主
  回复  引用  查看    
#4楼2009-10-26 16:51 | 金色海洋(jyk)      
谢谢,又从理论上学习了一遍范式。
以前发帖子,有人说我违反了范式,现在看看视乎违反的是第一范式。

“Blue,Yellow”这样的数据不能放在一个字段里,或者不能放在一条记录里面,那么为什么不能这么做呢?这么做了有什么危害,这么做了有没有好处呢?

在做员工联系方式的时候,我们是不是设计过“电话1”、“电话2”这种字段呢?

有时候确实一个人有两个手机号(比如一个联通的,一个移动的,或者一个北京的一个上海的。),那么这种情况怎么设计表结构呢?再分出来一个表?

就用一个表,有什么优点缺点?
分成两个表,有什么优点缺点?

这个时候要不要一切遵照范式来做而不考虑其他呢?

  回复  引用  查看    
#5楼2009-10-26 16:56 | Ivony...      
BCNF的例子很糟糕。


因为在一个教师只负责一门课程这个前提下,就可以得出,课程依赖于教师,教师可以决定课程,换言之教师是课程的Key。

那么在这个关系中:

学生 课程 教师

就可以简单的得出
教师 -> 课程

那么,学生和教师就成了候选键而不是学生和课程。
那么如果学生和教师成了候选键,而课程只依赖于教师,则违背2NF。

  回复  引用  查看    
#7楼[楼主]2009-10-26 17:06 | SNowtoDay      
@金色海洋(jyk)
对于为什么不能放在一个字段里,我觉得是显而易见的,以上述无论是匹配查询或者更新,都需要额外进行字符串处理。

凡事皆有例外,假如对这些数据永远不存在更新操作,界面上又只需要照文本原样显示。那么放在一个字段里我觉得也未尝不可。

对于为什么不用“电话1”、“电话2”,上面解释过了,这会带来查询困难等等。

  回复  引用  查看    
#8楼2009-10-26 17:26 | Ivony...      
1NF不允许出现NULL也是有道理的。

因为如果出现NULL,说明这个字段是一个集合,这个集合可能没有元素(NULL)或者有一个元素。

所以根据1NF,这个字段应该单独成为一个表,并以原表的键为键。这样可以最大限度的避免冗余。查询的时候,LEFT OUTER JOIN就可以了。

  回复  引用  查看    
#9楼2009-10-26 17:26 | winter-cn      
引用Ivony...:
引用金色海洋(jyk):
谢谢,又从理论上学习了一遍范式。
以前发帖子,有人说我违反了范式,现在看看视乎违反的是第一范式。

“Blue,Yellow”这样的数据不能放在一个字段里,或者不能放在一条记录里面,那么为什么不能这么做呢?这么做了有什么危害,这么做了有没有好处呢?

在做员工联系方式的时候,我们是不是设计过“电话1”、“电话2”这种字段呢?

有时候确实一个人有两个手机号(比如一个联通的,一个移动的,或者一个北京的一个上海的。),那么这种情况怎么设计表结构呢?再分出来一个表?

就用一个表,有什么优点缺点?
分成两个表,有什么优点缺点?

这个时候要不要...

@Ivony...
冗余仅仅是违反范式坏处的一方面 按比较官方的说法 违反范式可能导致的问题包括:插入异常、删除异常、更新异常、数据冗余
遵守范式的问题主要在时间性能

范式是一种工具 它用来检查设计的合理性 但不是说你把所有数据库做到6nf就是好

但是你不能因为"不能完全遵守范式"就"完全忽略这个无聊的东西"

我比较推荐先设计再优化的方法, 即设计时不考虑效率问题, 设计完之后根据可能的性能瓶颈打破范式重新修改

PS.有一点你说的很有道理 识别Key和functional dependency才是最重要的。跟设计模式一样,范式这些概念,我觉得最大的意义还是交流,当别人说"你这里违反第三范式了"你能马上明白怎么回事,而不需要很多解释。
  回复  引用  查看    
#10楼2009-10-26 17:34 | Ivony...      
@winter-cn

个人会觉得,范式这玩意儿用于交流的意义比设计模式还糟糕。比如说你这里违反了BCNF,还真不如说:“你的余额字段是通过总额减去消费算出来的,计算冗余了”简单明了,

关于设计模式用于交流我也持保留意见,尽管我知道那几个哥们儿发明这些名词的目的确实是为了交流,但恐怕现在用来忽悠人的成分更多。到底有几个真正在用于交流真也没见着,一个工厂模式,无论是代码还是设计图,一眼就应该能看出来,胡乱发明这些名词的意义有多大,真不好说。


好吧,最让我倒胃口的是,“反范式”和“反模式”,看到这俩词我就肚子里不舒服。。。。。你可以说这是中国特色,我却觉得那几个美国佬也要负责任。

  回复  引用  查看    
#11楼2009-10-26 17:35 | winter-cn      
引用金色海洋(jyk):
谢谢,又从理论上学习了一遍范式。
以前发帖子,有人说我违反了范式,现在看看视乎违反的是第一范式。

“Blue,Yellow”这样的数据不能放在一个字段里,或者不能放在一条记录里面,那么为什么不能这么做呢?这么做了有什么危害,这么做了有没有好处呢?

在做员工联系方式的时候,我们是不是设计过“电话1”、“电话2”这种字段呢?

有时候确实一个人有两个手机号(比如一个联通的,一个移动的,或者一个北京的一个上海的。),那么这种情况怎么设计表结构呢?再分出来一个表?

就用一个表,有什么优点缺点?
分成两个表,有什么优点缺点?

这个时候要不要一切遵照范式来做而不考虑其他呢?

电话1、电话2 如果换做是 左手电话和右手电话 就对了
当然如果你客户的公司专门为员工发放了一个联通和一个移动电话,且此处电话特指公司发的 那你这样设计也不错
你必须确保员工一定有且只有2个电话 大概意思就是如此

  回复  引用  查看    
#12楼2009-10-26 17:37 | LanceZhang      
范式太高也不是好事

一般来说超过巴斯克范式就能恶心死一大批人

  回复  引用  查看    
#13楼2009-10-26 17:40 | EricZhang(T2噬菌体)      
引用Ivony...:
其实这些玩意儿和设计模式一样都是很无聊的东西。

关系型数据规范化,是在复杂的数据库中消除数据冗余的方式。而这些范式则是让我们发现数据库中存在冗余的工具。消除冗余到什么程度,或者说该不该消除冗余,这不是范式可以解答的。


关于一二三范式,其定义都是非常明确而简单的,都是一些看起来很深奥的理论和名词使得它们看起来很复杂。


运用范式的关键在于你是不是能找出键和依赖关系。你找得出,什么范式都不会也能看出怎么消除冗余。找不出,把范式背的烂熟也无助于你消除冗余。


个人觉得这个点评不错,说到了点子上,范式主要在于运用,死记硬背是没用的。

不过希望这位仁兄能注意说话的方式和态度。范式和模式都不是“无聊”的东西,而且博主的文章写的很好,虽然我对范式比较熟悉,看过后也觉得受到不少益处。
至少你应该尊重别博主的劳动,别一出口就那个“无聊”,这个“无聊”。你一副高高在上的样子,出口就好似教育人,有没有想过博主的心情呢。

  回复  引用  查看    
#14楼2009-10-26 17:43 | EricZhang(T2噬菌体)      
引用LanceZhang:
范式太高也不是好事

一般来说超过巴斯克范式就能恶心死一大批人


我个人感觉,一般规范到3NF对大多数项目足够了,再规范下去,投入产出比太小,而且增加了很多复杂性,得不偿失。

不过对于大型的且对数据库设计要求较高的项目,如金融银行业的系统,还是应尽量向上规范。

  回复  引用  查看    
#15楼2009-10-26 17:44 | winter-cn      
引用Ivony...:
@winter-cn

个人会觉得,范式这玩意儿用于交流的意义比设计模式还糟糕。比如说你这里违反了BCNF,还真不如说:“你的余额字段是通过总额减去消费算出来的,计算冗余了”简单明了,

关于设计模式用于交流我也持保留意见,尽管我知道那几个哥们儿发明这些名词的目的确实是为了交流,但恐怕现在用来忽悠人的成分更多。到底有几个真正在用于交流真也没见着,一个工厂模式,无论是代码还是设计图,一眼就应该能看出来,胡乱发明这些名词的意义有多大,真不好说。

作为中国特色 工厂模式能写对用对的人其实不是很多 可能是因为文化差异 你会有这种感觉 其实英文社区里设计模式用来交流很方便的。

如果没有范式,也许你说"计算冗余了"会被你的同事嗤之以鼻,然后费一下午的时间解释为什么计算冗余不好,解释插入异常、删除异常、更新异常。

我总觉得你对概念有抵触情绪,不要觉得一旦定义了个名词就是纯理论的东西

  回复  引用  查看    
#16楼2009-10-26 17:51 | EricZhang(T2噬菌体)      
引用winter-cn:
引用Ivony...:
@winter-cn

个人会觉得,范式这玩意儿用于交流的意义比设计模式还糟糕。比如说你这里违反了BCNF,还真不如说:“你的余额字段是通过总额减去消费算出来的,计算冗余了”简单明了,

关于设计模式用于交流我也持保留意见,尽管我知道那几个哥们儿发明这些名词的目的确实是为了交流,但恐怕现在用来忽悠人的成分更多。到底有几个真正在用于交流真也没见着,一个工厂模式,无论是代码还是设计图,一眼就应该能看出来,胡乱发明这些名词的意义有多大,真不好说。

作为中国特色 工厂模式能写对用对的人其实不是很多 可能是因为文化差异 你会有这种感觉 其实英文社区里设计模式用来交流很方便的。

如果没有范式,也许你说"计算冗余了"会被你的同事嗤之以鼻,然后费一下午的时间解释为什么计算冗余不好,解释插入异常、删除异常、更新异常。

我总觉得你对概念有抵触情绪,不要觉得一旦定义了个名词就是纯理论的东西


记得以前有个朋友和我讲他的一个设计,杂七杂八说了一大堆,说的我晕了也没搞明白,后来终于听出点眉目,问了他一句:你这里就是要实现个观察着模式吧。他很高兴的说:是啊是啊。我说:那你咋不早说。他回答:哦,我怕说观察着你不懂。我当时就狂晕。。。囧。。。

  回复  引用  查看    
#17楼2009-10-26 17:51 | winter-cn      
引用EricZhang(T2噬菌体):
引用LanceZhang:
范式太高也不是好事

一般来说超过巴斯克范式就能恶心死一大批人


我个人感觉,一般规范到3NF对大多数项目足够了,再规范下去,投入产出比太小,而且增加了很多复杂性,得不偿失。

不过对于大型的且对数据库设计要求较高的项目,如金融银行业的系统,还是应尽量向上规范。

其实要求太高了关系数据库就不合适了...... 所以归根结底还是BCNF就够了 4nf+其实就是好玩

  回复  引用  查看    
#18楼2009-10-26 17:59 | Ivony...      
@winter-cn
@EricZhang(T2噬菌体)

集中回复一下。

首先我为我的言行向LZ道歉,尽管我觉得范式是一个很无聊的东西,但这不代表我否定LZ文章的价值。因为我觉得事实上在园子里,LZ说的好这样的回复,以我以往的经验来看,是不需要我来凑热闹的。我是看完了顺手点了推荐才回复的,所以我赞成推荐实名制。所谓的LZ说的好这样的无聊回复我一般懒得写,所以在没有任何客套铺垫的前提下直接发表了自己的牢骚。但如果影响了LZ的心情总是不好的。

如果我觉得瞎说八道的文章就直接回胡说八道了,如果觉得没有任何价值的文章直接Ctrl + W了。


其次是我承认我很多时候不想或者不愿意去保持中立。关于设计模式和范式,好吧我承认它们发明是用来沟通的。好吧我也承认其实问题出在翻译和该死的出版商上(如果翻译成设计模版/设计模范,数据库正规化形式,可能就没这么多问题)。

但问题是客观存在的,反模式和反范式就是这种问题累积到一定程度的爆发。好吧大家都保持中立,在自留地演说其实这些东西只是为了方便沟通,并不是什么高深的技术,也不是必须遵守的规范。有用没?

好吧我承认我粪了,我只是看到这篇文章可能带来的潜在的影响,故意往这上面扔一块土,避免它看起来金灿灿的,再让大家避免整出“反范式”的设计。


最后我想说的是,我所反对的并不是这些理论,而是这种不负责任的造词行为。消除冗余才是问题的根本,而不是去满足某个范式。不负责任的造词只会让众多不明真相的群众沉迷于概念的研究(这倒底是单例还是享元,这倒底是违反了BCNF还是2NF,不无聊么?)而忘记实际的问题。

  回复  引用  查看    
#19楼2009-10-26 18:06 | Ivony...      
引用EricZhang(T2噬菌体):

记得以前有个朋友和我讲他的一个设计,杂七杂八说了一大堆,说的我晕了也没搞明白,后来终于听出点眉目,问了他一句:你这里就是要实现个观察着模式吧。他很高兴的说:是啊是啊。我说:那你咋不早说。他回答:哦,我怕说观察着你不懂。我当时就狂晕。。。囧。。。


我举一个反面的例子吧。或许我们所处的环境不同,所以遇到的例子也不同。


一个朋友给我讲他的设计,说这里用了这模式那里用了那模式的,我建议他,你这里没必要这样。他一脸困惑的看着我,我这是为了XX模式啊,,,我顿时无语。。。。

其实可以比较一下这两者到底哪个更可怕?

  回复  引用    
#21楼2009-10-26 18:43 | 我的个人经验[未注册用户]
引用金色海洋(jyk):
......
在做员工联系方式的时候,我们是不是设计过“电话1”、“电话2”这种字段呢?

有时候确实一个人有两个手机号(比如一个联通的,一个移动的,或者一个北京的一个上海的。),那么这种情况怎么设计表结构呢?再分出来一个表?
......

海洋,理论我不想讲,只说自己去过的开发经验。

我曾做过销售系统中的“客户信息”这一块。这其中的数据来源于客户的“订货合同”,并且合同中的客户联系电话只填一个。

这样数据表中的电话字段只能填写一个号码。如果,现在有可能填写两个电话号码,可以再添加一个字段。比如:电话1;电话2

  回复  引用  查看    
#22楼[楼主]2009-10-26 19:00 | SNowtoDay      
晚饭归来,这么热闹了都。
回20楼Ivony...同学,就范式论范式,我觉得你的“单价 数量”的例子似乎不太对头。好吧,你是清醒的翻墙族,我是被深刻地毒害的不明真相的群众,:)。

其实我在3NF后面的总结中说了我是“姑妄言之”,有兴趣者“姑妄听之”,比放不放首页这样的讨论不是要好一些?

只是最近有相关的工作,完了之后常常拿范式来验证验证,对我而言,它是有用,我秉承的原则是“存在即是道理”。不想成了Ivony...同学眼中的流毒无穷,罪过罪过。

不过,thanks anyway。

  回复  引用  查看    
#23楼2009-10-26 19:08 | Ivony...      
@SNowtoDay

我想还是误会了,我并无意说任何人在流毒。

而是一个东西有可能流毒的前提下(或许这并非出于任何人的意愿),我只好顺手操起一把土扔上去。其实并不想伤及无辜。



好吧我承认我粪了,所以我对回复也进行了修改。还在慢慢改,大家表介意。。。。今天被某个回复触动了神经,觉得自己最近太久没粪了。。。。

大家都会说的东西,我懒得说,大家都懒得说的东西,却不正是要我这种脸厚的闲散人士来凑热闹么?


谈点有价值的东西吧,不能粪了半天啥也不说。

满足于第几范式,以及对第一范式的定义,并不应该作为一个数据结构设计的衡量标准。
或者我会认为,范式这东西,是对于一个很糟糕的数据结构进行剖析的工具。而不是用来做数据结构设计的时候的标杆。
似乎并没有任何理论可以说明满足更高的范式能避免更多的问题,或者说绝大多数的问题不会出现在没有满足范式的情况下。

适度的冗余有时候对于数据库而言甚至是必须的,也是提高数据库性能的常见手段。

那么怎么去运用范式,或者说在数据结构中什么是最要命的。个人觉得,确保每一个表都有明确的键,确保所有的冗余都有明确的依赖关系,这是最重要的。因为确保每一个表都有明确的键,可以使得我们再加载和更新数据时不会写错SQL语句。确保所有的冗余都有明确的依赖关系可以让我们制定明晰的同步规则。

所以核心还是在键和依赖关系上。

  回复  引用    
#24楼2009-10-26 19:14 | 我的个人经验[未注册用户]
楼主,我认为还应当有一张“FavoriteColor”表。

  回复  引用  查看    
#25楼[楼主]2009-10-26 19:25 | SNowtoDay      
@Ivony...
有人讨论总比没人看好。

河谐嘛,不同的观点都允许的,允许热爱天朝,也允许人翻墙或者做个犬儒主义,允许人热爱Linq,也允许人Anti-Linq

  回复  引用  查看    
#26楼2009-10-26 19:31 | Ivony...      
引用SNowtoDay:
@Ivony...
有人讨论总比没人看好。

河谐嘛,不同的观点都允许的,允许热爱天朝,也允许人翻墙或者做个犬儒主义,允许人热爱Linq,也允许人Anti-Linq



说到LINQ,我觉得更高层的范式在LINQ方面则更有用武之地。为何?因为某些LINQ场景毋须过多考虑性能问题,而且LINQ某些方面也比DBMS更为强大。这使得我们可以设计满足更高范式的数据结构而不用考虑太多。

  回复  引用  查看    
#27楼2009-10-26 19:41 | Ivony...      
引用SNowtoDay:
晚饭归来,这么热闹了都。
回20楼Ivony...同学,就范式论范式,我觉得你的“单价 数量”的例子似乎不太对头。好吧,你是清醒的翻墙族,我是被深刻地毒害的不明真相的群众,:)。

其实我在3NF后面的总结中说了我是“姑妄言之”,有兴趣者“姑妄听之”,比放不放首页这样的讨论不是要好一些?

只是最近有相关的工作,完了之后常常拿范式来验证验证,对我而言,它是有用,我秉承的原则是“存在即是道理”。不想成了Ivony...同学眼中的流毒无穷,罪过罪过。

不过,thanks anyway。



那是DKNF,我检讨了。。。。也删了相关内容了。。。。

  回复  引用  查看    
#28楼2009-10-26 20:37 | tnt-wei      
虽然我只看第一段就和博主产生共鸣,希望能经常交流!
  回复  引用  查看    
#29楼2009-10-26 21:39 | Ivony...      
算了,不粪了,还是讨论技术能受表扬,得小红花啥的。。。


关于1NF

怎么判断有没有重复组,或者说怎么判断多个字段是否同一性质?我有一个简单的方法,或许不完整,我是直接从集合的定义里推导出来的,大家不妨一听。

N个字段具备同一性质是指他们在应用领域中值域是一样的,在同一条记录中值永不相同,且没有顺序的区别。
也就是说如果你有两个字段,电话1和电话2,这两个字段的值域显然是一致的,如果对于任何一条记录而言它们的值又总是不相同,或者说如果相同可以只使用一个字段,且电话1和电话2的数据对调不会影响任何查询和逻辑,那么它们就是Repeate Group。


关于2NF
超键的定义是,可以唯一确定一条记录的字段集合。显然符合1NF的数据的所有字段集合自动是超键,超键可以有N个。

候选键的定义则是最简的超键,即不存在一个可以作为键字段集合,是一个候选键的子集,这里的最简不是最小。即一个表可以存在一个仨字段候选键还存在一个俩字段候选键,并不因为俩字段候选键的存在就否定那个仨字段候选键,只要俩字段的不是它的子集。候选键也可以有N个,这也是被称之为候选键的原因(同样对候选键这个翻译无限怨念)。


关于3NF
其实key就是键,键一般指超键。

可以简单的看出来,如果一个表拥有超键,则必然拥有候选键。如果一个东西依赖于所有的候选键,则这个东西必然依赖于所有的超键。
所以依赖于任何键,和依赖于任何候选键,是一个意思。:)


关于依赖
X依赖于Y(X和Y都是字段集合)或者说Y决定了X是指在关系(数据表)中,对于确定的Y,都有确定的X与之对应。或者通俗点说,X依赖于Y,是指存在X到Y的一对多或一对一的关系(不能是多对一或多对多)。

  回复  引用  查看    
#30楼2009-10-27 10:51 | trams      
不是太明白为什么1NF中要因为Date关系中有关顺序的特性了?我觉得NF和顺序特性没关系吧。对于关系理论来说关系是没有顺序的,而对于数据库来说表都是有顺序的。这点应该是矛盾的。