关系数据库设计
- 格式:doc
- 大小:63.50 KB
- 文档页数:8
关系型数据库设计原则与方法关系型数据库设计是一种常见的数据库设计方法,它的设计原则和方法可以用于设计和优化关系型数据库模式。
本文将介绍关系型数据库设计的五个基本原则和一些常用的方法,以帮助您更好地进行数据库设计和优化。
第一原则:数据分离原则数据分离原则是指将不同的数据类型分开存储,不混杂在同一个表中。
这个原则主要是考虑到数据的规范性和易维护性。
每个数据类型都应该有自己的表,通过相关字段建立关联,并通过外键实现关系。
这种设计方式使数据库的结构更清晰、规范,也方便日后对数据更新和查询。
第二原则:范式设计原则范式设计原则是关系型数据库设计中的核心概念。
它主要是通过分解数据,将重复的数据避免在表中出现,减少冗余和更新异常。
范式的级别分为一到五级,分别用1NF、2NF、3NF、BCNF、4NF和5NF表示。
一般来说,我们在设计数据库时应尽可能遵循更高级别的范式,以减少数据冗余和保证数据的一致性。
第三原则:主键设计原则主键是一种唯一标识数据记录的方式,它在关系型数据库中非常重要。
主键的设计要符合以下要求:1. 唯一性:每个记录的主键值是唯一的,确保数据的完整性和一致性。
2. 稳定性:主键的值应该是稳定不变的,不能频繁修改。
3. 简洁性:主键的值应该是简洁的,便于查询和索引。
常见的主键类型包括自增主键,UUID,日期时间等。
第四原则:索引设计原则索引在关系型数据库中起着加速查询和提高性能的作用。
但是过多或不恰当的索引设计可能会导致数据库性能下降。
索引的设计原则包括:1.覆盖索引:将索引包含需要查询的字段,减少数据库访问次数。
2.唯一性:非重复且唯一的字段适合设计索引。
3.选择性:选择那些频繁被查询的字段。
4.大小:索引的大小应控制在合理范围内,避免占用过多磁盘空间。
第五原则:范围控制原则通过范围控制可以将数据库的规模控制在一定的范围内,避免不必要的数据增长。
范围控制主要包括以下几方面:1.数据量估算:在设计数据库时要对数据量进行预估,合理规划存储空间。
关系数据库的数据模型设计方法随着计算机技术的不断发展,我们正处于一个数据信息化的时代,数据的管理和处理已经成为企业、政府、个人等各个领域的重要问题。
而关系数据库(Relational Database)作为一种常见的数据存储方式,其数据模型设计方法也成为数据管理中的关键环节。
关系数据库的数据模型设计包括三个部分:实体(Entity)、属性(Attribute)和关系(Relationship)。
实体是指现实世界中可以独立、区分的事物或对象;属性是指实体的属性或特征;关系则是描述实体之间的联系或关联。
在进行关系数据库的数据模型设计时,需要进行以下几个步骤:第一步,确定需要存储的实体和属性。
这个步骤需要对用户需求进行分析,找出用户需求中涉及到的实体和属性,并进行分类归纳。
例如,在设计一个学生信息管理系统时,需要确定实体有“学生”、“教师”等,属性有“学生姓名”、“专业”等。
第二步,确定实体之间的关系。
这个步骤需要对实体之间的联系或关系进行分析,找出实体之间的联系或关系,并进行分类归纳。
例如,在设计一个学生信息管理系统时,需要确定学生与课程之间的关系,即“学生选修了某个课程”。
第三步,建立实体关系图(ER图)。
根据前两步的分析结果,将实体和关系以图形的形式表现出来,形成一个实体关系图。
ER图是关系数据库模型的基本设计工具,通过ER图可以清晰地把实体和关系之间的联系表达出来,是设计关系数据库的必要步骤。
第四步,建立数据库表结构。
根据ER图,将实体和关系转换为数据库中的表结构,包括表的名称、属性、主键等。
例如,在设计学生信息管理系统时,可以将“学生”实体转换为一个“学生信息”表,该表包括“学生姓名”、“专业”等属性,同时还需要确定一个主键,通常是一个唯一标识符,用于唯一标识每一个记录。
第五步,进行数据填充和查询操作。
在确定好数据库表结构之后,就可以进行数据填充和查询操作了。
数据填充是将现实世界中的数据转换为数据库中的数据,通常是通过应用程序实现;查询操作是通过SQL语句进行实现,以便用户对数据库中的数据进行操作和查询。
简述关系数据库的设计步骤关系数据库是一种常用的数据库模型,它使用表、关系和键设计来存储、组织和查询数据。
基于关系数据库的设计是现代信息系统的基础,为实现高效的数据管理、存储和查询提供了非常重要的基础。
本文将阐述关系数据库设计的基本步骤,介绍它们如何在现代信息管理系统中应用,最终为系统用户提供可靠、可操作的信息服务。
首先,关系数据库设计必须考虑业务要求,并将其转换为设计要求,以确定数据模型及数据库的功能。
在这一步中,需要分析业务要求,确定业务模型,收集和组织需要的数据,确定有效的数据存储结构,特别是确定以及识别出业务实体,并确定属于这些业务实体的属性。
接下来,在将数据模型及功能转换为关系数据库结构时,通常遵循经典的数据库设计步骤,包括实体识别、实体关系建模、属性决定、关系表建模、索引设计、视图建模等。
在实体识别阶段,要进行概念建模,涉及对实体及实体间关系的分析和建模;在实体关系建模阶段,要发现多个实体之间的联系,并通过概念建模实现;属性决定阶段,要根据业务要求,确定每个实体属性的类型及唯一性;关系表建模阶段,要根据实体、属性和关系,建立每个实体的关系表;索引设计阶段,要根据使用频率,选择合适的索引类型和索引结构;视图建模阶段,要根据访问视图和系统需求,建立逻辑视图,最终创建物理视图。
最后,在完成基本的设计步骤之后,需要进行质量测试,以确保数据库的正常运行,包括数据完整性检查、安全性测试、功能测试、性能测试等,可以根据实际情况选择不同的测试策略。
从上述步骤可以看出,基于关系数据库的设计是一个复杂的过程,它要求设计者充分考虑业务要求,转换为数据模型、实体识别、属性决定、关系表建模、视图建模等步骤,最终保证数据库的正确性和高效性。
在现代信息管理系统中,关系数据库的设计以及维护工作日益重要。
有效的关系数据库设计,可以帮助系统用户实现信息查询要求,并能较好地支持信息管理系统的正常运行。
数据库系统(四)---关系型数据库设计及E-R图1、关系型数据库: 关系型数据库是⼀类采⽤关系模型作为逻辑数据模型的数据库系统,遵从数据库设计的基本步骤,包括:需求分析、概念结构设计、逻辑结构设计、物理结构设计、数据库实施、数据库的运⾏和维护等阶段。
概念结构设计与逻辑结构设计是关系数据库整个设计过程的关键。
2、关系数据库设计过程与各级模式 在关系数据库设计的不同阶段,会形成数据库的各级模式。
1)需求分析阶段,综合各个⽤户的应⽤需求; 2)概念结构设计阶段,形成独⽴于机器特点、独⽴于各个关系数据库管理系统产品的概念模式; 3)逻辑结构设计阶段,将 E-R 图转换成具体的数据库产品⽀持的关系数据模型,形成数据库逻辑模式,然后根据⽤户处理的要求、安全性的考虑,在基本表的基础上再建⽴必要的视图,形成数据的外模式; 4)物理结构的设计阶段,根据关系数据库管理系统的特点和处理的需要,进⾏物理存储安排,建⽴索引,形成数据库内模式。
3、概念结构设计⽅法 关系数据库的概念结构设计通常采⽤⾃顶向下法,它通过两个步骤来完成概念设计,⾸先建⽴局部信息结构,然后将局部信息结构合成为全局信息结构并优化,使⽤ E-R 图作为概念模型的描述⼯具。
1)局部信息结构设计 局部信息结构设计:根据需求分析报告中标明的不同⽤户视图范围所建⽴的满⾜该范围内⽤户需求的信息结构,称为局部信息结构。
局部信息结构设计的步骤包括:确定局部范围;选择实体;选择实体关键字;确定实体间联系;确定实体的属性。
2)E-R 图的表⽰⽅法 概念结构设计就是将需求分析得到的⽤户需求抽象为信息结构的过程,通常使⽤ E-R 图来作为描述现实世界的建模⼯具。
E-R 图提供了表⽰信息世界中实体、属性和联系的⽅法。
1.实体型,⽤矩形表⽰,写明实体的名称; 2.属性,⽤椭圆形表⽰,并⽤⽆向边将其与其相应的实体连接起来。
3.联系,⽤菱形表⽰,写明联系的名称,⽤⽆向边分别与有关实体连接起来,同时在⽆向边旁标注联系的类型(1:1、1:N 或 M:N),如果⼀个联系具有属性,则这些属性也要⽤⽆向边与该联系连接起来。
关系数据库的设计与规范化关系数据库是一种基于关系模型的数据库系统,它以表格的形式存储和组织数据。
在设计和组织关系数据库时,规范化是一项关键任务。
规范化是一种数据组织方法,其目的是通过消除冗余和不一致性,提高数据库的性能和灵活性。
本文将探讨关系数据库的设计和规范化的重要性,以及规范化的常用规则和技巧。
1. 规范化的重要性关系数据库的设计和规范化对于数据的一致性、完整性和性能有着重要影响。
以下是规范化的重要性:1.1 数据一致性:规范化可以消除数据中的冗余信息,确保每个数据片段只有一次出现在数据库中。
这样可以避免数据冲突和不一致性,提高数据的一致性。
1.2 数据完整性:规范化可以帮助保持数据的完整性。
通过将数据分解为更小的表,并通过外键和主键建立关系,可以确保数据的完整性和准确性。
1.3 性能提升:规范化可以提高数据库的性能。
通过减少数据冗余,可以节省存储空间,并提高查询和更新的速度。
2. 规范化的规则和技巧规范化涉及到一系列规则和技巧,以确保数据的一致性和完整性。
以下是规范化的常用规则和技巧:2.1 第一范式(1NF):确保表中的每个列都是原子的,即不可分解的。
每个列都应该只包含一个数据值,不允许有重复的列。
2.2 第二范式(2NF):确保每个表中的非主键列只与主键有关,而不是与其他非主键列有关。
这样可以消除非主键列之间的数据冗余。
2.3 第三范式(3NF):确保每个表中的非主键列只与主键有关,而不是与其他非主键列有关。
如果有一个非主键列与其他非主键列有关,应该将其移动到另一个表中。
2.4 层次化范式:将数据分解为多个逻辑层次上的表。
每个表都应该表示一个单独的实体或关系,避免表中信息的重复和冗余。
2.5 使用外键关系:通过外键约束来建立关系数据库中不同表之间的连接。
外键可以确保数据的完整性和一致性,同时还能提高查询性能。
2.6 避免主键冲突:在为表选择主键时,应确保每个记录都可以唯一地识别。
避免使用自然主键(如姓名、电话号码等),而是使用带有唯一性约束的人工主键。
关系数据库的规范化设计在当今数字化的时代,数据成为了企业和组织的重要资产。
关系数据库作为一种常用的数据存储和管理方式,其设计的合理性直接影响到数据的准确性、完整性和可用性。
而关系数据库的规范化设计则是确保数据库设计质量的关键步骤。
那么,什么是关系数据库的规范化设计呢?简单来说,就是通过一系列的规则和方法,对数据库中的表、字段、关系等进行优化,以减少数据冗余、避免数据不一致和提高数据操作的效率。
为什么要进行规范化设计呢?想象一下,如果我们的数据库设计不合理,会出现什么样的问题。
比如说,一个员工信息表中,既包含了员工的基本信息,又包含了员工的工作经历、薪资等详细信息。
这样的设计就会导致数据冗余,因为同一个员工的基本信息可能会在多条记录中重复出现。
这不仅浪费了存储空间,还容易在数据更新时出现不一致的情况。
比如,当我们修改一个员工的基本信息时,如果不小心只修改了其中的一部分记录,就会导致数据的混乱。
规范化设计的一个重要原则是消除数据冗余。
通过将相关的数据分离到不同的表中,并通过适当的关系进行连接,可以有效地减少冗余。
例如,将员工的基本信息放在一个表中,工作经历放在另一个表中,通过员工编号进行关联。
另一个重要原则是确保数据的一致性。
比如,在一个订单表中,订单的总金额应该等于订单中各个商品的金额之和。
如果数据库设计不合理,可能会导致计算总金额时出现错误,从而影响业务的准确性。
规范化设计还可以提高数据操作的效率。
合理的表结构和关系可以使查询、插入、更新和删除等操作更加高效。
比如,如果一个表中的字段过多,会导致数据存储和检索的效率降低。
在关系数据库的规范化设计中,通常会提到第一范式(1NF)、第二范式(2NF)、第三范式(3NF)等。
第一范式要求数据表中的每个字段都是不可再分的原子值。
比如说,一个“地址”字段不能同时包含省、市、区等信息,而应该将它们分别存储在不同的字段中。
第二范式要求数据表中的非主键字段完全依赖于主键。
关系数据库的规范化设计论述导言在规范化设计过程中,我们将关系数据库的数据结构优化为标准化的关系模式,以提高数据的一致性、完整性和可维护性。
本文将详细探讨关系数据库的规范化设计原则和方法。
1. 规范化基础关系数据库的规范化设计基于关系代数和关系理论,旨在消除数据冗余和数据更新异常,同时保证数据库的一致性和完整性。
规范化设计的基本原则包括:每个属性都应该是原子的,每个属性值都应该与其所在实体的其他属性值相对应,每个关系中应该存在一个主键唯一标识元组等。
2. 规范化级别关系数据库的规范化设计按照一定的规则和步骤进行,通常分为一至六个规范化级别。
2.1 第一范式(1NF)第一范式要求关系表的每个属性都是不可分的,即每个属性值都是原子值。
2.2 第二范式(2NF)第二范式要求关系表的所有非主属性完全依赖于主键,即没有部分依赖。
2.3 第三范式(3NF)第三范式要求关系表的所有非主属性既不传递依赖于主键,也不部分依赖于主键,即没有传递依赖。
2.4 巴斯-克特规范化(BCNF)巴斯-克特规范化是第三范式的扩展,要求关系表的每个决定因子都是候选键。
2.5 第四范式(4NF)第四范式要求关系表中的多值依赖关系建立在候选键之上,即没有多值依赖。
2.6 第五范式(5NF)第五范式要求关系表中的每个非平凡函数依赖都是自然连接无损连接的。
3. 规范化设计的步骤规范化设计的步骤包括:识别实体和属性、确定函数依赖关系、逐级分解关系、消除冗余关系、确定候选键和主键等。
3.1 识别实体和属性首先,我们需要识别出实体及其属性。
一个实体是现实世界中可区分的事物,属性是实体的特征。
3.2 确定函数依赖关系在确定关系表的属性之间的关系时,需要找出各属性之间的函数依赖关系。
函数依赖表示一个属性的值依赖于其他属性的值。
3.3 逐级分解关系根据函数依赖关系,我们可以将关系表逐级分解为满足不同范式要求的关系表。
3.4 消除冗余关系在逐级分解关系的过程中,可能会产生冗余关系。
关系数据库的设计原则关系数据库是一种常用的数据库管理系统,它将数据以表格的形式进行组织和存储。
根据实际需求,设计一个高效且可靠的关系数据库非常关键。
以下是关系数据库设计的一些原则和指导:1. 数据库需求分析:在设计关系数据库之前,首先需要进行数据库需求分析。
这包括确定数据库中需要存储的数据类型、数据量以及数据之间的关系。
通过深入了解业务需求,可以确保数据库的准确性和完整性。
2. 数据库规范化:数据库规范化是关系数据库设计的基本原则之一。
它通过将数据分解成更小的、更规范的表来消除数据冗余和不一致性。
常用的规范化形式包括第一范式、第二范式和第三范式。
规范化能够提高数据库的性能和可维护性。
3. 主键设计:主键是用来唯一标识数据库表中每个记录的字段。
在设计关系数据库时,需要为每个表选择一个合适的主键。
主键应该具有唯一性和稳定性,并且不应该包含可变的信息。
常用的主键类型包括自增长整数、全局唯一标识符(GUID)等。
4. 外键关系:外键是用来建立不同表之间的关联关系的字段。
在设计关系数据库时,需要使用外键来确保数据的完整性和一致性。
外键能够实现表之间的关联查询和数据的级联操作,但需要注意外键的索引和性能优化。
5. 索引设计:索引是提高数据库查询性能的重要手段。
在设计关系数据库时,需要根据查询需求选择合适的索引字段。
索引应该选择具有高选择性的字段,并避免过多的索引和冗余的索引。
同时,需要定期对索引进行维护和优化。
6. 数据类型选择:在设计关系数据库时,需要选择合适的数据类型来存储数据。
常见的数据类型包括整数、字符、日期、时间等。
正确选择数据类型可以提高数据库的存储效率和查询性能。
7. 数据库安全性设计:数据库安全性是关系数据库设计的重要考虑因素之一。
在设计关系数据库时,需要考虑数据的访问权限、用户身份验证、数据加密等安全措施。
合理的安全设计可以保护数据库免受未经授权的访问和数据泄露的风险。
8. 性能优化设计:性能优化是关系数据库设计的关键目标之一。
关系数据库的设计步骤
1、用户需求分析:首先需要了解客户所需要的数据库的应用背景,
包括存储的数据的功能,以及数据库所需要进行的各项功能和运算,分析
它们之间的联系及关系,从而明确出用户需求,为后续数据库设计提供依据。
2、确定逻辑模型:根据用户需求,选择合适的ER模型,确定实体和
实体与实体之间的关联关系,以及实体的属性,形成逻辑模型,此逻辑模
型是数据库设计的核心步骤。
3、确定数据字典:确定数据字典,定义每一个属性的属性名称、属
性类型以及键的类型,确定每一个实体的主键,并且定义属性及其属性之
间的关系,以及各表之间的关联关系。
4、确定完整性约束:确定完整性约束,包括主键约束、外键约束、
参照完整性等,以及实体与实体之间可能存在的业务约束,确保数据库中
数据的准确性、完整性、可靠性。
5、设计物理结构:将建立的逻辑模型转换为物理模型,针对不同的
数据库管理系统,利用数据库设计工具建立出恰当的索引、表等物理结构,使之能够被系统所识别并支持。
关系型数据库的设计与实现关系型数据库是一种基于关系模型来组织和管理数据的数据库系统。
它采用表格的形式表示数据,并通过表格之间的关联来实现数据的高效查询和管理。
在本文中,我们将探讨关系型数据库的设计与实现,介绍其核心概念、设计原则和实施步骤。
1. 关系数据库的核心概念1.1 表格和关系关系型数据库中的数据存储在表格中,每个表格由若干列和若干行组成。
每一列代表一个数据字段,每一行代表一个数据记录。
表格之间可以建立关系,通过定义外键约束来指明数据之间的关联关系。
1.2 主键和外键主键是表格中唯一识别每条记录的字段,它的值必须是唯一且非空的。
外键是指一个表格中的字段引用了另一个表格中的主键,用于建立两个表格之间的关联。
1.3 视图视图是由一个或多个表格生成的虚拟表格,它可以隐藏底层数据结构的复杂性,并提供更简化和高效的数据访问接口。
视图可以用于数据查询、数据过滤和数据修改等操作。
2. 关系型数据库设计原则2.1 原子性每个字段要保持原子性,即每个字段只包含一个值。
这样可以简化数据的操作和查询,并提高数据的可靠性和一致性。
2.2 唯一性每张表格应该具有唯一的主键,以保证每条记录的唯一性。
这样可以避免数据冗余和数据不一致的问题,提高数据的质量和一致性。
2.3 一致性数据在各个表格之间应该保持一致性,即通过定义外键约束来约束数据的关联关系。
这样可以避免数据的混乱和不一致,提高数据的可靠性和完整性。
2.4 数据分离不同种类的数据应该放在不同的表格中,避免数据的混杂和复杂性。
通过合理划分表格和定义关联关系,可以提高数据的可读性和易用性。
3. 关系型数据库的实施步骤3.1 需求分析在设计关系型数据库之前,需要先进行需求分析,明确数据库系统的功能和数据需求。
此阶段需要和用户或相关部门进行沟通,了解业务流程和数据流程,并识别出主要实体、属性和关系。
3.2 数据建模根据需求分析的结果,可以进行数据建模。
数据建模是将现实世界中的实体、属性和关系映射到关系模型中的一个过程。
关系数据库的设计原则主要包括以下几个方面:1. 数据规范化:规范化是指将数据分解成最小、独立的实体,消除数据冗余和不一致。
规范化的目的是提高数据的完整性、一致性和可维护性。
常用的规范化方法包括第一范式(1NF)、第二范式(2NF)和第三范式(3NF)。
2. 数据抽象:抽象是指将现实世界的事物或概念转化为数据库中的表、字段和数据类型。
在设计数据库时,应根据现实世界的需求和目标,选择合适的抽象层次和数据结构,以便更好地表达实体及其之间的关系。
3. 数据完整性:数据完整性是指数据的准确性、一致性和可靠性。
在设计数据库时,需要确保数据的完整性,通过设置主键、外键、约束和触发器等手段来限制数据的输入、修改和删除操作,防止非法数据进入数据库。
4. 数据安全性:数据安全性是指保护数据库免受未经授权的访问、篡改和破坏。
在设计数据库时,需要考虑如何实现用户身份验证、权限控制、数据加密等安全机制,以确保数据的安全性。
5. 数据性能优化:性能优化是指提高数据库的查询速度和响应时间。
在设计数据库时,需要考虑如何优化表的结构、索引、查询语句等,以提高数据库的性能。
6. 数据扩展性:数据扩展性是指数据库能够适应未来数据量的增长和需求变化。
在设计数据库时,需要考虑如何实现数据表的分区、分片、水平拆分等扩展策略,以便在未来能够方便地扩展数据库。
7. 数据一致性:数据一致性是指在多个用户并发访问数据库时,确保数据的完整性和一致性。
在设计数据库时,需要考虑如何实现事务管理、锁定机制、并发控制等一致性策略,以确保数据的一致性。
综上所述,关系数据库的设计原则主要包括数据规范化、数据抽象、数据完整性、数据安全性、数据性能优化、数据扩展性以及数据一致性。
在设计关系数据库时,需要遵循这些原则,以确保数据库的质量、性能和安全性。
数据库工程师复习重点:关系数据库逻辑设计关系数据库逻辑设计5.1 概述5.2 基本概念5.2.1 关系模型1、关系模型采用一个二维表格在计算机中组织、存储、处理和管理数据。
(1) 关系名(数据库名):由字母数字组成;(2) 属性名;(3) 关系模式和关系:描述模式描述关系的静态结构,由模式名、关系模式所包含的属性及属性值所满足的条件组成模式定义。
(4) 元组:描述关系中的行;(5) 域:它定义关系的每个属性取值的类型;(6) 主码:能够惟一标识关系中每一个元组的属性或属性组;(7) 关系的数学定义:关系模式是建立在集合集论的基础上的,用数学的概念定义关系有;(A) 定义一:域是值的集合,同一个域中的值具有相同的数据类型;(B) 定义二:(C) 定义三:(D) 当关系引用了属性名后关系具有以下属性:[1] 不能有重复的元组;[2] 元组上下无序;[3] 按属性名引用时属性左右无序;[4] 所有属性值都是原子项(不可再分);(8) 总结:关系是一张二维表,表中的一行被称为一个元组,一列称为属性,由一组域值组成。
关系是元组的集合,关系中的每个元组在数学上被定义为这个关系所涉及的全部域值中笛卡儿积的一个元素。
5.2.2 关系数据库1、关系数据库是按照二维表组织和存储的相互关联的关系的集合,关系数据库模式是关系模式的集合;5.2.3 关系的完整性1、关系的完整性(完整性约束):是对关系的某种约束规则和关系满足的定义。
通常这组约束规则用来限定和检查数据库所含实例的合法性和正确性;2、完整性约束分静态和动态两种,静态完整性约束是基于关系模式的,主要有主码、外码约束和域约束组成;动态完整性约束是基于企业的业务规则的。
3、静态完整性约束规则:(1) 主码约束:主码必须满足:(A) 惟一性:在一个关系中不存在两个元组,它们具有相同的主码值;(B) 最小性:不存在从组成主码的属性集中去掉一个属性,还仍能保持数据的惟一性;(2) 外码约束:(3) 用户定义的完整性:5.3 关系数据库设计理论5.3.1 问题的提出究竟一个关系数据库包含哪些属性是合理的,如何评价一个关系模式设计的优劣?5.3.2 函数依赖函数依理论利用一个关系中属性之间的依赖关系评价和优化关系模式,以保证存储到数据库中的关系具有较好特性;1、函数依赖:(1) 设R(U)为一关系模式,X和Y为属性全集U的子集,若对于R(U)的任意一个可能的关系r,r中不可能存在两个元组在X上的属性值相等,而在Y上的属性值不等,则称“X函数决定Y”或“Y函数依赖于X”,并记作X Y,其中X称为决定因素,因为根据函数依赖定义,给定一个X,就能惟一决定一个Y。
目录一 Codd的RDBMS12法则——RDBMS的起源二关系型数据库设计阶段三设计原则四命名规则数据库设计,一个软件项目成功的基石。
很多从业人员都认为,数据库设计其实不那么重要。
现实中的情景也相当雷同,开发人员的数量是数据库设计人员的数倍。
多数人使用数据库中的一部分,所以也会把数据库设计想的如此简单。
其实不然,数据库设计也是门学问。
从笔者的经历看来,笔者更赞成在项目早期由开发者进行数据库设计(后期调优需要DBA)。
根据笔者的项目经验,一个精通OOP和ORM的开发者,设计的数据库往往更为合理,更能适应需求的变化,如果追其原因,笔者个人猜测是因为数据库的规范化,与OO的部分思想雷同(如内聚)。
而DBA,设计的数据库的优势是能将DBMS的能力发挥到极致,能够使用SQL和DBMS实现很多程序实现的逻辑,与开发者相比,DBA优化过的数据库更为高效和稳定。
如标题所示,本文旨在分享一名开发者的数据库设计经验,并不涉及复杂的SQL语句或DBMS使用,因此也不会局限到某种DBMS产品上。
真切地希望这篇文章对开发者能有所帮助,也希望读者能帮助笔者查漏补缺。
一?Codd的RDBMS12法则——RDBMS的起源Edgar Frank Codd(埃德加·弗兰克·科德)被誉为“关系数据库之父”,并因为在数据库管理系统的理论和实践方面的杰出贡献于1981年获图灵奖。
在1985年,Codd 博士发布了12条规则,这些规则简明的定义出一个关系型数据库的理念,它们被作为所有关系数据库系统的设计指导性方针。
1.信息法则?关系数据库中的所有信息都用唯一的一种方式表示——表中的值。
2.保证访问法则?依靠表名、主键值和列名的组合,保证能访问每个数据项。
3.空值的系统化处理?支持空值(NULL),以系统化的方式处理空值,空值不依赖于数据类型。
4.基于关系模型的动态联机目录?数据库的描述应该是自描述的,在逻辑级别上和普通数据采用同样的表示方式,即数据库必须含有描述该数据库结构的系统表或者数据库描述信息应该包含在用户可以访问的表中。
5.统一的数据子语言法则?一个关系数据库系统可以支持几种语言和多种终端使用方式,但必须至少有一种语言,它的语句能够一某种定义良好的语法表示为字符串,并能全面地支持以下所有规则:数据定义、视图定义、数据操作、约束、授权以及事务。
(这种语言就是SQL)6.视图更新法则?所有理论上可以更新的视图也可以由系统更新。
7.高级的插入、更新和删除操作?把一个基础关系或派生关系作为单个操作对象处理的能力不仅适应于数据的检索,还适用于数据的插入、修改个删除,即在插入、修改和删除操作中数据行被视作集合。
8.数据的物理独立性?不管数据库的数据在存储表示或访问方式上怎么变化,应用程序和终端活动都保持着逻辑上的不变性。
9.数据的逻辑独立性?当对表做了理论上不会损害信息的改变时,应用程序和终端活动都会保持逻辑上的不变性。
10.数据完整性的独立性?专用于某个关系型数据库的完整性约束必须可以用关系数据库子语言定义,而且可以存储在数据目录中,而非程序中。
11.分布独立性?不管数据在物理是否分布式存储,或者任何时候改变分布策略,RDBMS的数据操纵子语言必须能使应用程序和终端活动保持逻辑上的不变性。
12.非破坏性法则?如果一个关系数据库系统支持某种低级(一次处理单个记录)语言,那么这个低级语言不能违反或绕过更高级语言(一次处理多个记录)规定的完整性法则或约束,即用户不能以任何方式违反数据库的约束。
二?关系型数据库设计阶段(一)规划阶段规划阶段的主要工作是对数据库的必要性和可行性进行分析。
确定是否需要使用数据库,使用哪种类型的数据库,使用哪个数据库产品。
(二)概念阶段概念阶段的主要工作是收集并分析需求。
识别需求,主要是识别数据实体和业务规则。
对于一个系统来说,数据库的主要包括业务数据和非业务数据,而业务数据的定义,则依赖于在此阶段对用户需求的分析。
需要尽量识别业务实体和业务规则,对系统的整体有初步的认识,并理解数据的流动过程。
理论上,该阶段将参考或产出多种文档,比如“用例图”,“数据流图”以及其他一些项目文档。
如果能够在该阶段产出这些成果,无疑将会对后期进行莫大的帮助。
当然,很多文档已超出数据库设计者的考虑范围。
而且,如果你并不精通该领域以及用户的业务,那么请放弃自己独立完成用户需求分析的想法。
用户并不是技术专家,而当你自身不能扮演“业务顾问”的角色时,请你选择与项目组的相关人员合作,或者将其视为风险呈报给PM。
再次强调,大多数情况,用户只是行业从业者,而非职业技术人员,我们仅仅从用户那里收集需求,而非依赖于用户的知识。
记录用户需求时,可以使用一些技巧,当然这部分内容有些可能会超出数据库设计人员的职责:努力维护一系列包含了系统设计和规格说明信息的文档,如会议记录、访谈记录、关键用户期望、功能规格、技术规格、测试规格等。
频繁与干系人沟通并收集反馈。
标记出你自己添加的,不属于客户要求的,未决内容。
与所有关键干系人尽快确认项目范围,并力求冻结需求。
此外,必须严谨处理业务规则,并详细记录。
在之后的阶段,将会根据这些业务规则进行设计。
当该阶段结束时,你应该能够回答以下问题:需要哪些数据?数据该被怎样使用?哪些规则控制着数据的使用?谁会使用何种数据?客户想在核心功能界面或者报表上看到哪些内容?数据现在在哪里?数据是否与其他系统有交互、集成或同步?主题数据有哪些?核心数据价值几何,对可靠性的要求程度?并且得到如下信息:实体和关系属性和域可以在数据库中强制执行的业务规则需要使用数据库的业务过程(三)逻辑阶段逻辑阶段的主要工作是绘制E-R图,或者说是建模。
建模工具很多,有不同的图形表示方法和软件。
这些工具和软件的使用并非关键,笔者也不建议读者花大量时间在建模方法的选择上。
对于大多数应用来说,E-R图足以描述实体间的关系。
建模关键是思想而不是工具,软件只是起到辅助作用,识别实体关系才是本阶段的重点。
除了实体关系,我们还应该考虑属性的域(值类型、范围、约束)(四)实现阶段实现阶段主要针对选择的RDBMS定义E-R图对应的表,考虑属性类型和范围以及约束。
(五)物理阶段物理阶段是一个验证并调优的阶段,是在实际物理设备上部署数据库,并进行测试和调优。
三设计原则(一)降低对数据库功能的依赖功能应该由程序实现,而非DB实现。
原因在于,如果功能由DB实现时,一旦更换的DBMS不如之前的系统强大,不能实现某些功能,这时我们将不得不去修改代码。
所以,为了杜绝此类情况的发生,功能应该有程序实现,数据库仅仅负责数据的存储,以达到最低的耦合。
(二)定义实体关系的原则当定义一个实体与其他实体之间的关系时,需要考量如下:牵涉到的实体?识别出关系所涉及的所有实体。
所有权?考虑一个实体“拥有”另一个实体的情况。
基数?考量一个实体的实例和另一个实体实例关联的数量。
关系与表数量描述1:1关系最少需要1张表。
描述1:n关系最少需要2张表。
描述n:n关系最少需要3张表。
(三)列意味着唯一的值如果表示坐标(0,0),应该使用两列表示,而不是将“0,0”放在1个列中。
(四)列的顺序列的顺序对于表来说无关紧要,但是从习惯上来说,采用“主键+外键+实体数据+非实体数据”这样的顺序对列进行排序显然能得到比较好的可读性。
(五)定义主键和外键数据表必须定义主键和外键(如果有外键)。
定义主键和外键不仅是RDBMS的要求,同时也是开发的要求。
几乎所有的代码生成器都需要这些信息来生成常用方法的代码(包括SQL文和引用),所以,定义主键和外键在开发阶段是必须的。
之所以说在开发阶段是必须的是因为,有不少团队出于性能考虑会在进行大量测试后,在保证参照完整性不会出现大的缺陷后,会删除掉DB的所有外键,以达到最优性能。
笔者认为,在性能没有出现问题时应该保留外键,而即便性能真的出现问题,也应该对SQL文进行优化,而非放弃外键约束。
(六)选择键1 人工键与自然键人工健——实体的非自然属性,根据需要由人强加的,如GUID,其对实体毫无意义;自然健——实体的自然属性,如身份证编号。
人工键的好处:键值永远不变永远是单列存储人工键的缺点:因为人工键是没有实际意义的唯一值,所以不能通过人工键来避免重复行。
笔者建议全部使用人工键。
原因如下:在设计阶段我们无法预测到代码真正需要的值,所以干脆放弃猜测键,而使用人工键。
人工键复杂处理实体关系,而不负责任何属性描述,这样的设计使得实体关系与实体内容得到高度解耦,这样做的设计思路更加清晰。
笔者的另一个建议是——每张表都需要有一个对用户而言有意义的自然键,在特殊情况下也许找不到这样一个项,此时可以使用复合键。
这个键我在程序中并不会使用其作为唯一标识,但是却可以在对数据库直接进行查询时使用。
使用人工键的另一根弊端,主要源自对查询性能的考量,因此选择人工键的形式(列的类型)很重要:自增值类型?由于类型轻巧查询效率更好,但取值有限。
GUID?查询效率不如值类型,但是取值无限,且对开发人员更加亲切。
2 智能健与非智能键智能键——键值包含额外信息,其根据某种约定好的编码规范进行编码,从键值本身可以获取某些信息;非智能键,单纯的无意义键值,如自增的数字或GUID。
智能键是一把双刃剑,开发人员偏爱这种包含信息的键值,程序盼望着其中潜在的数据;数据库管理员或者设计者则讨厌这种智能键,原因也是很显然的,智能键对数据库是潜在的风险。
前面提到,数据库设计的原则之一是不要把具有独立意义的值的组合实现到一个单一的列中,应该使用多个独立的列。
数据库设计者,更希望开发人员通过拼接多个列来得到智能键,即以复合主键的形式给开发人员使用,而不是将一个列的值分解后使用。
开发人员应该接受这种数据库设计,但是很多开发者却想不明白两者的优略。
笔者认为,使用单一列实现智能键存在这样一个风险,就是我们可能在设计阶段无法预期到编码规则可能会在后期发生变化。
比如,构成智能键的局部键的值用完而引起规则变化或者长度变化,这种编码规则的变化对于程序的有效性验证与智能键解析是破坏性的,这是系统运维人员最不希望看到的。
所以笔者建议如果需要智能键,请在业务逻辑层封装(使用只读属性),不要再持久化层实现,以避免上述问题。
(七)是否允许NULL关于NULL我们需要了解它的几个特性:任何值和NULL拼接后都为NULL。
所有与NULL进行的数学操作都返回NULL。
引入NULL后,逻辑不易处理。
那么我们是否应该允许列为空呢?笔者认为这个问题的答案受到我们的开发语言的影响。
以C#为例,因为引入了可空类型来处理数据库值类型为NULL的情形,所以是否允许为空对开发者来说意义并不大。
但有一点必须注意,就是验证非空必须要在程序集进行处理,而不该依赖于DBMS的非空约束,必须确保完整数据(所有必须的属性均被赋值)到达DB(所谓的“安全区”,我们必须定义在多层系统中那些区域得到的数据是安全而纯净的)。