数据库设计范式

范式的概念和理论是美国著名科学哲学家托马斯·库恩(Thomas,Kunn) 提出并在《科学革命的结构》(The Structure of Scientific Revolutions)(1962)中系统阐述的,指常规科学所赖以运作的理论基础和实践规范,是从事某一科学的研究者群体所共同遵从的世界观和行为方式。
  范式概念是库恩范式理论的核心,而范式从本质上讲是一种理论体系。库恩指出:“按既定的用法,范式就是一种公认的模型或模式。”“我采用这个术语是想说明,在科学实际活动中某些被公认的范例——包括定律、理论、应用以及仪器设备统统在内的范例——为某种科学研究传统的出现提供了模型。”在库恩看来,范式是一种对本体论、认识论和方法论的基本承诺,是科学家集团所共同接受的一组假说、理论、准则和方法的总和,这些东西在心理上形成科学家的共同信念。范式的特点是:(1)范式在一定程度内具有公认性;(2)范式是一个由基本定律、理论、应用以及相关的仪器设备等构成的一个整体,它的存在给科学家提供了一个研究纲领;(3)范式还为科学研究提供了可模仿的成功的先例。可以看出,在库恩的范式论里,范式归根到底是一种理论体系,范式的突破导致科学革命,从而使科学获得一个全新的面貌。库恩对范式的强调对促进心理学中的理论研究具有重要意义。 (http://www.pep.com.cn/200406/ca441474.htm )
  由于范式概念是库恩整个科学哲学观的中心,他试图以此来概括和描述多个领域的现实科学, 而不仅仅是对科学史和哲学感兴趣,因而从不同方面、不同层次和不同角度对范式概念作了多重的界定和说明。很多人没有注意到库恩思想的这一特征, 往往根据自己的需要引述库恩的某一解释来阐述自己的问题。因而不免出现某些偏差。英国学者玛格丽特·玛斯特曼对库恩的范式观作了系统的考察, (1987)他从《科学革命的结构》中列举了库恩使用的21种不同含义的范式, 并将其概括为三种类型或三个方面:
  一是作为一种信念、一种形而上学思辨, 它是哲学范式或元范式;
  二是作为一种科学习惯、一种学术传统、一个具体的科学成就,它是社会学范式;
  三是作为一种依靠本身成功示范的工具、一个解疑难的方法、一个用来类比的图像, 它是人工范式或构造范式。
  虽然范式的首要含义在哲学方面,这也是库恩范式的基本部分, 但是, 库恩的创见和独到之处则在于范式的社会学含义和构造功能。与一般科学哲学思维的抽象性相反, 库恩特别强调科学的具体性,并把具体性看作是科学的基本特性, 因为他认为, 一套实际的科学习惯和科学传统对于有效的科学工作是非常必要和非常重要的, 它不仅是一个科学共同体团结一致、协同探索的纽带, 而且是其进一步研究和开拓的基础; 不仅能赋予任何一门新学科以自己的特色,而且决定着它的未来和发展。这样一来,库恩也就把具体性作为自己哲学思想的核心, 在实际的“图像”、“模型”和“哲学”之间划了一条界限,使自己的思想与其他科学哲学区别开来。库恩的构造范式就是这种实际的“图像”和“模型”,它不仅使常规科学解疑难的活动得以完成,从而成为开启新学科的契机和手段, 而且在应用模型和形而上学之间建立起一种新的相互关系, 解决了从一般哲学理论转向实际科学理论的途径问题。我们通常讨论和运用的是范式的后面两种含义。
  关于库恩以及范式转换(paradigm shift)
  美国科学史家库恩,以其代表作《科学革命的结构》(1962)(以下简称《结
  构》)而饮誉世界,尽管人们对它有两种截然不同的看法:一种看法认为它是“智
  慧历史的一座里程碑”、“半个世纪以来科学领域最重要的发掘”;另一种看法则
  认为它是“完全不足信的”和“耀眼的错误”。
  在库恩看来,“科学革命”的实质,一言以蔽之,就是“范式转换”;是少部
  分人在广泛接受的科学范式里,发现现有理论解决不了的“例外”,尝试用竞争性
  的理论取而代之,进而排挤掉“不可通约”的原有范式。当然,一个新范式的确立
  并不是一蹴而就的,而是需要赢得大部分科学家的“选票”。
  库恩的范式理论大体来自于由科学史实例引发的思考。二千多年前,亚里斯多
  德认为“物体自由落体的速度和物体的重量成正比”。因此,“物体越重,下落的
  速度就越快”。这一观察似乎接近日常生活的事实:除非在真空里,一张纸和一本
  书落地的速度是不一样的。但是,如果把它们合在一起,下落得更快还是更慢?伽
  利略爬上了比萨斜塔,用一对同样大小的木球和铅球,以实验的方式,证明它们是
  同时落地的。现在的中学生都知道,亚氏理论是错的。为什么二千年来,人们一直
  承袭着这个错误的认识呢?
  当波普儿和他的对手们正在热烈地讨论着科学的“可否定性”时,库恩认为,
  一门理论的正确与否是不可能被“证错”或“证对”的,它不过是在那儿。就像一
  套合身的衣服,只到发现它变得不合身了为止。一门理论在经历了一段时间的“问
  题解答”以后,就会遇到越来越多的“怪题”。从解答不了到出现危机,就会刺激
  新的理论出现,而旧的理论就像不合身的衣服一样被扔掉。“斜塔实验”就是这样
  使人们放弃了过时的亚氏理论。
  “例外(Anormly)”对于理解科学进步极其有帮助,因为它们指出了原有模
  式的不足并刺激新的理论产生。众所周知,1900年英国物理学家汤姆逊曾经宣称:
  在物理学的天空上只剩下两朵“乌云”。然而,正是这两朵“乌云”在二十世纪导
  致了相对论和量子理论的诞生。1873年《牛津英语词典》曾经引用达尔文的话:
  “在自然界里,没有比一个不能飞的鸟为更大的例外。”可见,一个例外的事实通
  常是不为现有的概念框架所预期的、难以解释的和逻辑不相容的。库恩在《结构》
  中写到:“发现源于对例外的意识,就是说,源于对那些多少违反常态科学统摄下
  先导预期的性质的认识(第52至53页)。”科学发现作为一个复杂的过程推动范式
  转换,在旧范式中的“例外”在新范式里就不再是例外。
  以库恩的话来讲,“常态科学”是科学群体共同分享的一系列模式和假设,通
  常在严谨的逻辑框架下运行,如果没有大胆的探索精神是断不可以打破这些框架
  的。而处于“常态”下的科学家们远非客观,他们有理由持守“正统”的理论,而
  倾向于在现有的架构内寻找问题的答案。譬如,公元三世纪希腊天文学家
  Aristarchus 就提出了行星围绕太阳旋转的理论。但是当时的科学群体却以托勒密
  的地心学说为正统,没有准备好接受这一认识的飞跃。
  库恩的批判者认为他力图把科学说成不过是一群“乌合”的规则。库恩则认
  为:“这是没有道理的,我要准备为此不实而争辩。”
  如果说“常态科学”是缓慢、连续、稳定和积累的变化,那么“科学革命”或
  “范式转换”则是极少发生却又极有意义的变化。确认了范式的存在,科学就没有
  不朽坏的范式,“婴儿科学”常常是从少部分人那里探索出来的,如伽利略、牛
  顿、达尔文、爱因斯坦等。库恩相信,科学的历史是由那些极具洞察力的新思想推
  动的,而不是连续积累的效应。“常态科学”只是在科学首创确立以后的“精湛
  化”。
  库恩的范式理论也是人们常常拿来批判霍根《科学的终结》的一部分。他们认
  为科学的探索是没有止境的,霍根看到的所谓“科学的终结”,不过是库恩描述的
  “常态科学”那一部分。范式转换甚至是不可预期和“计划”出来的。因此,从根
  本上证明霍根是错误的,需要等待新的科学突破并由此而导致的范式转换。
  在科学与神学的无限争吵中,库恩的发现似乎更有利于神学,实际上是错觉。
  科学哲学的理性思考一再告诫人们:科学是在一定时期内的假设,自然科学的权威
  不宜用来衡量人文价值。神学曾经是中世纪欧洲人的“可靠”知识来源,近代科学
  的诞生则基本取代了神学的位置。
  在英语里,库恩赋予了原意为“语法模式”的“范式”一词以“现代含义”,
  然而它的暧昧性使得它几乎可以被套用到传统与创新的任何领域,各路人士对它也
  无不心领神会。例如,工业人士认为技术创新,从蒸汽机到计算机,可以引起产业
  结构(范式)的变化;经济学家则运用税收政策来促进公司结构(范式)的合理
  化;在管理学中还出现了一系列诸如组织范式、开放范式、同步范式、协同范式、
  参照范式和随机范式等等杂烩新术语;社会学家更是把它奉为至宝,用来描述所谓
  “社会范式”的变化;布什政府1989年也曾推行过一个不太成功的“新范式运
  动”,如确保教育、强化市场、赈济穷人和行政分权等。无怪乎有人抱怨库恩的
  “新意”早已面目全非以致成为“陈词滥调”。批评者在他的经典《结构》一书里
  发现了二十二个“范式”的不确切使用,库恩也承认他对“范式”一词的使用出现
  了“弹性”。
  库恩范式学说似乎和中国传统的整体思维观念一拍即合,很容易引起中国人的
  共鸣。如经济学者把它来作为“改革目标转换模式”的理论依据;企业家据此再造
  企业的内部结构、转换机制等;历史学家用它来解释朝代的变更,如“超稳定系
  统”,有“问题是老的,方法是新的”一说;或探讨“李约瑟难题”:为什么近代
  科学没有在中国产生?有“科学技术循环加速”一说;或回答资本主义制度为什么
  在英国产生,有“潜在结构”一说,等等,大体都是从结构的“新角度”入手。
  笔者给出这么多范式外用的例子,并不是要给读者一个它“多么有效”的误
  解。相反,范式分析作为一种方法也存在着局限。有的应用、或套用、或滥用不仅
  空洞、肤浅,而且缺乏严谨的结构介定、没有转换的临界条件分析等等。范式转换
  也不可能那么频繁,有人主张科学的各大领域一年来一次范式更新,这不过是“浪
  漫的幻想”。其他领域也是一样,如果没有思维的突破、技术的更新,单纯的所谓
  “范式转换”就毫无意义。“例外”导致现有框架的危机,应运而生的新思想又往
  往是导致范式转换的契机,而不是无病呻吟地倒置过来。
  具有讽刺意味的是,库恩并没有让历史学家完全信服自然科学可以清晰地划分
  为“常态”和“革命”相互交替的阶段,而哲学家和社会学家似乎对库恩的理论倍
  感兴趣。我们应该意识到,库恩的探讨不同于他的奉承者,如西方“后现代派”把
  他作为反科学的“同盟者”,片面地“发展”他的理论。他们的研究范围通常包括
  哲学、心理学、认识论、社会学、文化、女权和艺术等等。自波普尔、库恩和费耶
  阿本德等科学哲学家对科学的深刻反省以来,在过去的二、三十年里,“后现代
  派”的一个逆反倾向就是缺乏对真理的理性探讨。他们共同的信条就是宣称“一切
  知识都是由文化决定的”,进而滑向了强烈反科学的偏见里。
  库恩1922年出生于辛辛那提,这座美丽的小城市是笔者到美国来生活的第一
  站。库恩曾获哈佛大学的物理学博士学位,曾在多所大学里任教,最后一站止于麻
  省理工大学,研究兴趣由物理学转为科学史。库恩于1996年6月在麻州去世。美国
  副总统戈尔评论到:“更准确地讲,他揭示了已经被建立的理论在新的事实和观察
  得不到解释的压力下,是如何崩溃的。”这一概括,就其实质性的贡献而言,也算
  公允。
  (1999年6月12日于美国)
  ================================================================================================
  设计范式(范式,数据库设计范式,数据库的设计范式)是符合某一种级别的关系模式的集合。构造数据库必须遵循一定的规则。在关系数据库中,这种规则就是范式。关系数据库中的关系必须满足一定的要求,即满足不同的范式。目前关系数据库有六种范式:第一范式(1NF)、第二范式(2NF)、第三范式(3NF)、第四范式(4NF)、第五范式(5NF)和第六范式(6NF)。满足最低要求的范式是第一范式(1NF)。在第一范式的基础上进一步满足更多要求的称为第二范式(2NF),其余范式以次类推。一般说来,数据库只需满足第三范式(3NF)就行了。下面我们举例介绍第一范式(1NF)、第二范式(2NF)和第三范式(3NF)。
  在创建一个数据库的过程中,范化是将其转化为一些表的过程,这种方法可以使从数据库得到的结果更加明确。这样可能使数据库产生重复数据,从而导致创建多余的表。范化是在识别数据库中的数据元素、关系,以及定义所需的表和各表中的项目这些初始工作之后的一个细化的过程。
  下面是范化的一个例子  Customer   Item purchased    Purchase price   Thomas    Shirt        $40   Maria Tennis shoes     $35    Evelyn    Shirt $40  Pajaro Trousers $25   
  如果上面这个表用于保存物品的价格,而你想要删除其中的一个顾客,这时你就必须同时删除一个价格。范化就是要解决这个问题,你可以将这个表化为两个表,一个用于存储每个顾客和他所买物品的信息,另一个用于存储每件产品和其价格的信息,这样对其中一个表做添加或删除操作就不会影响另一个表。
    
  关系数据库的几种设计范式介绍
  1 第一范式(1NF)
  在任何一个关系数据库中,第一范式(1NF)是对关系模式的基本要求,不满足第一范式(1NF)的数据库就不是关系数据库。
  所谓第一范式(1NF)是指数据库表的每一列都是不可分割的基本数据项,同一列中不能有多个值,即实体中的某个属性不能有多个值或者不能有重复的属性。如果出现重复的属性,就可能需要定义一个新的实体,新的实体由重复的属性构成,新实体与原实体之间为一对多关系。在第一范式(1NF)中表的每一行只包含一个实例的信息。例如,对于图3-2 中的员工信息表,不能将员工信息都放在一列中显示,也不能将其中的两列或多列在一列中显示;员工信息表的每一行只表示一个员工的信息,一个员工的信息在表中只出现一次。简而言之,第一范式就是无重复的列。
  2 第二范式(2NF)
  第二范式(2NF)是在第一范式(1NF)的基础上建立起来的,即满足第二范式(2NF)必须先满足第一范式(1NF)。第二范式(2NF)要求数据库表中的每个实例或行必须可以被惟一地区分。为实现区分通常需要为表加上一个列,以存储各个实例的惟一标识。如图3-2 员工信息表中加上了员工编号(emp_id)列,因为每个员工的员工编号是惟一的,因此每个员工可以被惟一区分。这个惟一属性列被称为主关键字或主键、主码。
  第二范式(2NF)要求实体的属性完全依赖于主关键字。所谓完全依赖是指不能存在仅依赖主关键字一部分的属性,如果存在,那么这个属性和主关键字的这一部分应该分离出来形成一个新的实体,新实体与原实体之间是一对多的关系。为实现区分通常需要为表加上一个列,以存储各个实例的惟一标识。简而言之,第二范式就是非主属性非部分依赖于主关键字。
  3 第三范式(3NF)
  满足第三范式(3NF)必须先满足第二范式(2NF)。简而言之,第三范式(3NF)要求一个数据库表中不包含已在其它表中已包含的非主关键字信息。例如,存在一个部门信息表,其中每个部门有部门编号(dept_id)、部门名称、部门简介等信息。那么在图3-2的员工信息表中列出部门编号后就不能再将部门名称、部门简介等与部门有关的信息再加入员工信息表中。如果不存在部门信息表,则根据第三范式(3NF)也应该构建它,否则就会有大量的数据冗余。简而言之,第三范式就是属性不依赖于其它非主属性。
  数据库设计三大范式应用实例剖析
  数据库的设计范式是数据库设计所需要满足的规范,满足这些规范的数据库是简洁的、结构明晰的,同时,不会发生插入(insert)、删除(delete)和更新(update)操作异常。反之则是乱七八糟,不仅给数据库的编程人员制造麻烦,而且面目可憎,可能存储了大量不需要的冗余信息。
  设计范式是不是很难懂呢?非也,大学教材上给我们一堆数学公式我们当然看不懂,也记不住。所以我们很多人就根本不按照范式来设计数据库。
  实质上,设计范式用很形象、很简洁的话语就能说清楚,道明白。本文将对范式进行通俗地说明,并以笔者曾经设计的一个简单论坛的数据库为例来讲解怎样将这些范式应用于实际工程。
  范式说明
  第一范式(1NF):数据库表中的字段都是单一属性的,不可再分。这个单一属性由基本类型构成,包括整型、实数、字符型、逻辑型、日期型等。
  例如,如下的数据库表是符合第一范式的:
  字段1 字段2 字段3 字段4
  而这样的数据库表是不符合第一范式的:
  字段1 字段2 字段3 字段4
  字段3.1 字段3.2
  很显然,在当前的任何关系数据库管理系统(DBMS)中,傻瓜也不可能做出不符合第一范式的数据库,因为这些DBMS不允许你把数据库表的一列再分成二列或多列。因此,你想在现有的DBMS中设计出不符合第一范式的数据库都是不可能的。
  第二范式(2NF):数据库表中不存在非关键字段对任一候选关键字段的部分函数依赖(部分函数依赖指的是存在组合关键字中的某些字段决定非关键字段的情况),也即所有非关键字段都完全依赖于任意一组候选关键字。
  假定选课关系表为SelectCourse(学号, 姓名, 年龄, 课程名称, 成绩, 学分),关键字为组合关键字(学号, 课程名称),因为存在如下决定关系:
  (学号, 课程名称) → (姓名, 年龄, 成绩, 学分)
  这个数据库表不满足第二范式,因为存在如下决定关系:
  (课程名称) → (学分)
  (学号) → (姓名, 年龄)
  即存在组合关键字中的字段决定非关键字的情况。
  由于不符合2NF,这个选课关系表会存在如下问题:
  (1) 数据冗余:
  同一门课程由n个学生选修,"学分"就重复n-1次;同一个学生选修了m门课程,姓名和年龄就重复了m-1次。
  (2) 更新异常:
  若调整了某门课程的学分,数据表中所有行的"学分"值都要更新,否则会出现同一门课程学分不同的情况。
  (3) 插入异常:
  假设要开设一门新的课程,暂时还没有人选修。这样,由于还没有"学号"关键字,课程名称和学分也无法记录入数据库。
  (4) 删除异常:
  假设一批学生已经完成课程的选修,这些选修记录就应该从数据库表中删除。但是,与此同时,课程名称和学分信息也被删除了。很显然,这也会导致插入异常。
  把选课关系表SelectCourse改为如下三个表:
  学生:Student(学号, 姓名, 年龄);
  课程:Course(课程名称, 学分);
  选课关系:SelectCourse(学号, 课程名称, 成绩)。
  这样的数据库表是符合第二范式的, 消除了数据冗余、更新异常、插入异常和删除异常。
  另外,所有单关键字的数据库表都符合第二范式,因为不可能存在组合关键字。
  第三范式(3NF):在第二范式的基础上,数据表中如果不存在非关键字段对任一候选关键字段的传递函数依赖则符合第三范式。所谓传递函数依赖,指的是如果存在"A → B → C"的决定关系,则C传递函数依赖于A。因此,满足第三范式的数据库表应该不存在如下依赖关系:
  关键字段 → 非关键字段x → 非关键字段y
  假定学生关系表为Student(学号, 姓名, 年龄, 所在学院, 学院地点, 学院电话),关键字为单一关键字"学号",因为存在如下决定关系:
  (学号) → (姓名, 年龄, 所在学院, 学院地点, 学院电话)
  这个数据库是符合2NF的,但是不符合3NF,因为存在如下决定关系:
  (学号) → (所在学院) → (学院地点, 学院电话)
  即存在非关键字段"学院地点"、"学院电话"对关键字段"学号"的传递函数依赖。
  它也会存在数据冗余、更新异常、插入异常和删除异常的情况,读者可自行分析得知。
  把学生关系表分为如下两个表:
  学生:(学号, 姓名, 年龄, 所在学院);
  学院:(学院, 地点, 电话)。
  这样的数据库表是符合第三范式的,消除了数据冗余、更新异常、插入异常和删除异常。
  鲍依斯-科得范式(BCNF):在第三范式的基础上,数据库表中如果不存在任何字段对任一候选关键字段的传递函数依赖则符合第三范式。
  假设仓库管理关系表为StorehouseManage(仓库ID, 存储物品ID, 管理员ID, 数量),且有一个管理员只在一个仓库工作;一个仓库可以存储多种物品。这个数据库表中存在如下决定关系:
  (仓库ID, 存储物品ID) →(管理员ID, 数量)
  (管理员ID, 存储物品ID) → (仓库ID, 数量)
  所以,(仓库ID, 存储物品ID)和(管理员ID, 存储物品ID)都是StorehouseManage的候选关键字,表中的唯一非关键字段为数量,它是符合第三范式的。但是,由于存在如下决定关系:
  (仓库ID) → (管理员ID)
  (管理员ID) → (仓库ID)
  即存在关键字段决定关键字段的情况,所以其不符合BCNF范式。它会出现如下异常情况:
  (1) 删除异常:
  当仓库被清空后,所有"存储物品ID"和"数量"信息被删除的同时,"仓库ID"和"管理员ID"信息也被删除了。
  (2) 插入异常:
  当仓库没有存储任何物品时,无法给仓库分配管理员。
  (3) 更新异常:
  如果仓库换了管理员,则表中所有行的管理员ID都要修改。
  把仓库管理关系表分解为二个关系表:
  仓库管理:StorehouseManage(仓库ID, 管理员ID);
  仓库:Storehouse(仓库ID, 存储物品ID, 数量)。
  这样的数据库表是符合BCNF范式的,消除了删除异常、插入异常和更新异常。
  范式应用
  我们来逐步搞定一个论坛的数据库,有如下信息:
  (1) 用户:用户名,email,主页,电话,联系地址
  (2) 帖子:发帖标题,发帖内容,回复标题,回复内容
  第一次我们将数据库设计为仅仅存在表:
  用户名 email 主页 电话 联系地址 发帖标题 发帖内容 回复标题 回复内容
  这个数据库表符合第一范式,但是没有任何一组候选关键字能决定数据库表的整行,唯一的关键字段用户名也不能完全决定整个元组。我们需要增加"发帖ID"、"回复ID"字段,即将表修改为:
  用户名 email 主页 电话 联系地址 发帖ID 发帖标题 发帖内容 回复ID 回复标题 回复内容
  这样数据表中的关键字(用户名,发帖ID,回复ID)能决定整行:
  (用户名,发帖ID,回复ID) → (email,主页,电话,联系地址,发帖标题,发帖内容,回复标题,回复内容)
  但是,这样的设计不符合第二范式,因为存在如下决定关系:
  (用户名) → (email,主页,电话,联系地址)
  (发帖ID) → (发帖标题,发帖内容)
  (回复ID) → (回复标题,回复内容)
  即非关键字段部分函数依赖于候选关键字段,很明显,这个设计会导致大量的数据冗余和操作异常。
  我们将数据库表分解为(带下划线的为关键字):
  (1) 用户信息:用户名,email,主页,电话,联系地址
  (2) 帖子信息:发帖ID,标题,内容
  (3) 回复信息:回复ID,标题,内容
  (4) 发贴:用户名,发帖ID
  (5) 回复:发帖ID,回复ID
  这样的设计是满足第1、2、3范式和BCNF范式要求的,但是这样的设计是不是最好的呢?
  不一定。
  观察可知,第4项"发帖"中的"用户名"和"发帖ID"之间是1:N的关系,因此我们可以把"发帖"合并到第2项的"帖子信息"中;第5项"回复"中的"发帖ID"和"回复ID"之间也是1:N的关系,因此我们可以把"回复"合并到第3项的"回复信息"中。这样可以一定量地减少数据冗余,新的设计为:
  (1) 用户信息:用户名,email,主页,电话,联系地址
  (2) 帖子信息:用户名,发帖ID,标题,内容
  (3) 回复信息:发帖ID,回复ID,标题,内容
  数据库表1显然满足所有范式的要求;
  数据库表2中存在非关键字段"标题"、"内容"对关键字段"发帖ID"的部分函数依赖,即不满足第二范式的要求,但是这一设计并不会导致数据冗余和操作异常;
  数据库表3中也存在非关键字段"标题"、"内容"对关键字段"回复ID"的部分函数依赖,也不满足第二范式的要求,但是与数据库表2相似,这一设计也不会导致数据冗余和操作异常。
  由此可以看出,并不一定要强行满足范式的要求,对于1:N关系,当1的一边合并到N的那边后,N的那边就不再满足第二范式了,但是这种设计反而比较好!
  对于M:N的关系,不能将M一边或N一边合并到另一边去,这样会导致不符合范式要求,同时导致操作异常和数据冗余。
  对于1:1的关系,我们可以将左边的1或者右边的1合并到另一边去,设计导致不符合范式要求,但是并不会导致操作异常和数据冗余。
  结论
  满足范式要求的数据库设计是结构清晰的,同时可避免数据冗余和操作异常。这并意味着不符合范式要求的设计一定是错误的,在数据库表中存在1:1或1:N关系这种较特殊的情况下,合并导致的不符合范式要求反而是合理的。
  在我们设计数据库的时候,一定要时刻考虑范式的要求。

原文地址:https://www.cnblogs.com/zfying/p/2324596.html