数据库设计系列9--将ER模型映射为表

简介:
在前面的步骤中,我们创建了数据库的ER模型,ER模型属于概念级别的模型,需要映射为表才能被计算机存储。本章节的目标就是从ER模型中创建表,并检查这些表的结构。这组表应该代表逻辑数据库模型中的实体,关系,属性和约束。然后检查每个表的结构,确保建表过程中没有产生错误。如果表中有错误,则表明在建表的过程中或在ER模型中仍有发现的错误。将ER模型映射为表的过程如下所述的步骤:
1.  创建表。创建表的目标是从从ER模型映射表集合,在这步中,为ER模型创建表来表达实体,关系,属性和约束,每个标的结构来源于ER所描述的信息,这些信息包括ER图,数据字典和任何其他相关的文档。我们使用关系数据库定义语言DBDL来描述每个表的组成,首先确定表的名字,在后面跟着该表的简单属性的名字,并将这些属性的名字括在括号中,然后标示该表的主键以及任何备用键和外键,对于每个外键,还要给出包含被引用主键的表。在创建的过程中,需要注意以下的事项:
a)    如何表达实体,对于模型中的每个实体,创建一个包含实体的所有简单属性的表。例如对于复合属性 Address ,应该包含它的简单属性 Street,state,zipcode, 如果有可能,标示每个表中的主键的列。
      如何表达关系,一个实体与另一个实体间的关系由主键 / 外键机制表达,为了决定将外键属性放在哪里,首先必须标示关系中包含父实体和子实体。不同类型的关系和多值属性主要有:
                       i.   一对多的二元关系,对每个一对多的二元关系,关系一端的实体被设计为父实体,多端的实体被设计为字实体。为了描述这种关系,父实体主键的拷贝被放在字实体的表中。在一对多关系中有一个或者多个属性的情况下,这些属性也随着主键加到子表中。
                     ii. 一对多递归关系 , 一对多递归关系和一对多的二元关系很相似,只不过父实体和子实体都是同一个表。
                    iii.   一对一二元关系。一对一的二元关系的表稍微有些复杂。因为不能使用元组的数目来表示一个关系中的父实体和子实体。而是需要使用参与过程来决定把实体结合为一个表来表示关系。考虑如下的参与约束。
1.  1 1 关系的两边都是强制参与,在这种情况下,应该将两个实体合为一个表。并选择初始实体中的一个主键作为新表的主键。其他的键作为备用键。
2.1:1 关系的一边是强制参与,在这种情况下可以使用参与约束来标示 1 1 关系的父实体和子实体,关系中强制参与的实体被设计为子实体,可选参与的实体被设计为父实体。
3.  1 1 关系的两边均为可选参与。这种情况下父实体和子实体之间的设计是任意的。除非你可以得到关于关系的更多信息来帮助你判断使用那个设计。
b) 一对一递归关系。对于一对一递归关系,应该遵循上面所描述的对 1 1 关系的参与规则。但是在这种情况下,父实体和子实体是相同的,对于两边有强制参与的 1:1 递归关系,应该用主键的两个拷贝,来把这个递归关系,描述为一个表,同前面一样,主键的一个拷贝代表外键,并且应该将他重命名来表示他代表的关系。
c)  多对多的二元关系,对于每个多对多的二元关系,创建一个表达关系的表,这个表包含关系的任何属性,我们将参与关系的实体的主键属性拷贝到新表中,使之为外键,一个外键或全部外键将组成新表的主键,可能结合此关系的一些属性。
d) 复杂关系类型,有多于两个参与实体的关系是复杂关系,为每个复杂关系创建一个表达关系的表,将参与复杂关系的这些实体的主键复制到新表中,并作为外键,此表还包含与关系相关的全部属性,一个或多个外键将组成新表的主键,还可以加上关系中的一些其他属性。
e)  多值属性,对于每个与实体有关的多值属性,应该遵守上述 1:* 关系中所描述的规则,在一端的实体被指定为父实体,在多端的多值属性被指定为子实体,创建一个新的表包含这些多值属性,并将父实体的主键拷贝过来作为外键,除非多值属性自己本身是父实体的备用键,否则,新表的主键由多值属性和父实体的原始主键组成。
2.   用规范化的方法检查表的结构。这个步骤地目标是检查和使用规范化标准,使每个表的结构正确。用规范化的方法检查表可以避免不必要的数据重复。应该确保前面所建立的表至少是第三范式的,如果所标示的表不是第三范式的,可能表明 ER 模型的某部分是错误的。或者由模型创建表的时候产生了错误。
3.   检查表是否支持用户事务。这个步骤的目标是取保所产生的表支持用户所需要的事务。检查表是否支持事务的一种方法是检查是否支持事务的数据需求。以确保数据在一个或多个表中存在。同时,如果事务所需要的数据在多个表中,则应该检查这些表是否能够通过主键外键连接起来。
4.   检查业务规则。目标是检查逻辑数据库设计中表达的业务规则。业务规则适用于防止数据不完整,不准确或者不一致的约束,尽管 DBMS 在完整性方面的控制可能存在也可能不存在,但这不是问题所在,在这个阶段,你只关心高级设计,即确定需要什么样的数据完整性约束,而不管怎么样去实现,标示完整性约束之后,就可以得到一个完整而准确的描述视图的局部逻辑数据模型。如果必要的话,可以从逻辑数据模型产生物理数据库设计,在为用户构建系统的原形时,需要考虑如下的一个常见的完整性约束:
                       i. 需要的数据,即某些列的数据是必须要填写的。
                     ii. 列的值域约束,每个列都有一个值域,
                    iii. 实体完整性,实体的主键不能为空。
                   iv.  多样性,多样性表达了数据库中数据间的关系的约束。比如班级必须有学生,而且必须有班主任,
                     v. 参照完整性。外键包含的与父表象匹配的主键值。关于主键需要注意以下两点: 1 。主键允许为空吗? 2. 如何保证参照的完整性,当向字表中插入数据,删除数据,更新子表记录外键,向父表中插入数据,从父表删除数据时,应该进行哪些约束,如 No Action,Cascade,set Null,set Defaule,No Check
5.   与用户讨论逻辑数据库设计。目标是为了确保局部逻辑数据模型与描述模型的文档确实表达了用户视图。此视图的逻辑数据库设计应该已经设计完全,并且全部存档,但在完成这个步骤之前,应该与用户一起研究这个设计。
本文转自凌辉博客51CTO博客,原文链接http://blog.51cto.com/tianli/58491如需转载请自行联系原作者

lili00okok
相关文章
|
2月前
|
前端开发 IDE 数据库连接
ThinkPHP6 模型层的模型属性,表映射关系,以及如何在控制层中使用模型层和模型层中的简单CRUD
本文详细介绍了ThinkPHP6中模型层的使用,包括模型属性设置、表映射关系、以及如何在控制层中使用模型层进行CRUD操作。
ThinkPHP6 模型层的模型属性,表映射关系,以及如何在控制层中使用模型层和模型层中的简单CRUD
|
2月前
|
前端开发 数据库 开发者
数据模型(数据库表设计)生成代码
BizWorks ToolKit 插件集成 Mybatis-Plus 代码生成工具,支持从数据库表批量生成代码,简化开发流程。本文详细介绍配置方法及项目示例,包括配置文件格式、生成选项及具体操作步骤,帮助开发者快速实现代码同步更新。配置文件 `.mp.yaml` 支持自定义输出目录、生成组件等,适用于多种项目结构。
46 0
|
3月前
|
Java 数据库连接 数据库
AI 时代风起云涌,Hibernate 实体映射引领数据库高效之路,最佳实践与陷阱全解析!
【8月更文挑战第31天】Hibernate 是一款强大的 Java 持久化框架,可将 Java 对象映射到关系数据库表中。本文通过代码示例详细介绍了 Hibernate 实体映射的最佳实践,包括合理使用关联映射(如 `@OneToMany` 和 `@ManyToOne`)以及正确处理继承关系(如单表继承)。此外,还探讨了常见陷阱,例如循环依赖可能导致的无限递归问题,并提供了使用 `@JsonIgnore` 等注解来避免此类问题的方法。通过遵循这些最佳实践,可以显著提升开发效率和数据库操作性能。
83 0
|
3月前
|
SQL 存储 NoSQL
从SQL到NoSQL:理解不同数据库类型的选择与应用——深入比较数据模型、扩展性、查询语言、一致性和适用场景,为数据存储提供全面决策指南
【8月更文挑战第31天】在信息技术飞速发展的今天,数据库的选择至关重要。传统的SQL数据库因其稳定的事务性和强大的查询能力被广泛应用,而NoSQL数据库则凭借其灵活性和水平扩展性受到关注。本文对比了两种数据库类型的特点,帮助开发者根据应用场景做出合理选择。SQL数据库遵循关系模型,适合处理结构化数据和复杂查询;NoSQL数据库支持多种数据模型,适用于非结构化或半结构化数据。SQL数据库在一致性方面表现优异,但扩展性较差;NoSQL数据库则设计之初便考虑了水平扩展性。SQL使用成熟的SQL语言,NoSQL的查询语言更为灵活。
75 0
|
3月前
|
API 数据库 开发者
【独家揭秘】Django ORM高手秘籍:如何玩转数据模型与数据库交互的艺术?
【8月更文挑战第31天】本文通过具体示例详细介绍了Django ORM的使用方法,包括数据模型设计与数据库操作的最佳实践。从创建应用和定义模型开始,逐步演示了查询、创建、更新和删除数据的全过程,并展示了关联查询与过滤的技巧,帮助开发者更高效地利用Django ORM构建和维护Web应用。通过这些基础概念和实践技巧,读者可以更好地掌握Django ORM,提升开发效率。
39 0
|
3月前
|
SQL Shell API
python Django教程 之 模型(数据库)、自定义Field、数据表更改、QuerySet API
python Django教程 之 模型(数据库)、自定义Field、数据表更改、QuerySet API
|
4月前
|
关系型数据库 MySQL 数据库
navicat 查看,设计并导出数据库 ER图
navicat 查看,设计并导出数据库 ER图
688 5
|
3月前
|
SQL JSON 关系型数据库
"SQL老司机大揭秘:如何在数据库中玩转数组、映射与JSON,解锁数据处理的无限可能,一场数据与技术的激情碰撞!"
【8月更文挑战第21天】SQL作为数据库语言,其能力不断进化,尤其是在处理复杂数据类型如数组、映射及JSON方面。例如,PostgreSQL自8.2版起支持数组类型,并提供`unnest()`和`array_agg()`等函数用于数组的操作。对于映射类型,虽然SQL标准未直接支持,但通过JSON数据类型间接实现了键值对的存储与查询。如在PostgreSQL中创建含JSONB类型的表,并使用`->>`提取特定字段或`@>`进行复杂条件筛选。掌握这些技巧对于高效管理现代数据至关重要,并预示着SQL在未来数据处理领域将持续扮演核心角色。
55 0
|
5月前
|
SQL XML 数据库
后端数据库开发高级之通过在xml文件中映射实现动态SQL
后端数据库开发高级之通过在xml文件中映射实现动态SQL
51 3
|
5月前
|
SQL XML Java
后端数据库开发JDBC编程Mybatis之用基于XML文件的方式映射SQL语句实操
后端数据库开发JDBC编程Mybatis之用基于XML文件的方式映射SQL语句实操
71 3