数据库-数据库建模
在需求收集、定义和可视化之后,要进行的就是数据库建模,也称之为逻辑建模(Logical Database Modeling)。
在这一步,以之前的概念建模为蓝本,使用数据库管理系统(DBMS)实施数据库模型,也称逻辑模型。
关系数据库模型
在逻辑模型中,最常用的就是关系数据库模型,采用此模型建模的数据库叫做关系数据库。
创建关系数据库的过程,就是将完成的ER图转化为一个逻辑数据库模型,即关系模式(Relational Schema)。
目前大多数的商业DBMS软件包,比如Oracle、MySQL、Microsoft SQL Server、DB2、Access等,都是关系数据库管理系统(RDBMS)。
基本概念
关系(Relation)在关系数据库中存在的形式就是包含行和列的表,因此也称之为关系表(Relation Table),简称表(Table)。关系数据库本质上就是不同名称的关系的集合。
表中的列(Column)被称为域(Field)或属性(Attribute)。
表中的行(Row)被称为元组(Tuple)或记录(Record)。
尽管所有关系都是表,但是并不是所有表都是关系。一个表要能被成为关系,需要满足如下几个需求:
- 每一列必须要有一个名称,且在一张表中,不能有相同的列名
- 在一张表中,不能存在完全相同的列
- 在行中,每一列的值都只能为单值
- 每一列中的值,必须属于同一个域(相同的预定义规则)
- 列顺序无关
- 行顺序无关
主码
定义:每一个关系必须有一个主码,对于每一行来说,主码是取值不同的一列(或几列的集合)。
主码的目的是在关系中区分不同的行。主码通常使用下划线来与其他列区分开来。
将实体映射为关系
讲实体映射为关系的过程,就是将一个常规实体的常规属性转为对应关系的一列,如果该实体存在唯一属性,则在对应的关系中的列就是主码。
将具有复合关系的实体映射为关系
复合属性包含有其子属性,当映射为关系时,复合属性自身并不会体现在表中,而是将细粒度当子属性作为表中当列。
例如人当居住地址,当其为一个复合属性包含省、市、区以及详细地址当属性时,体现在关系中的列因为是这些子属性,而不会出现“居住地址”这一列。
将具有唯一复合属性的实体映射为关系
当一个复合属性具有唯一性时,映射到关系中,将会有多个属性作为主码,这称之为复合主码。
将具有可选属性到实体映射为关系
当一个可选属性的实体映射到关系时,对应到关系的列可以为空值。
实体完整性约束
约束:为确保关系数据库的有效性而需满足的各种规则。
实体完整性约束:在一张关系表中,不存在包含空值的主码列。也就是说一个实体的可选属性不能成为关系的主码。
外码
外码:外码是某关系中的一列,这一列又恰好是另外一个关系的主码。
当有外码出现在关系模式中时,会将外码连线到另一个关系到主码。
外码重命名:一个表到外码名称不一定要和另外一个表到主码名称相同。能更加方便清晰地表示该列所在关系的意义。
将联系映射为关系数据库组件
1:M联系的映射
一对多联系的映射规则:
有一对多联系中属于M侧的实体所映射得到的关系有一个外码,这个外码对应于由1侧的实体映射得到的关系中的主码
在这个学生和班级到关系中,一个班级对应多个学生。student表中的class_id属性就是外码,也是class表中的主码。
M:N联系的映射
多对多联系的映射规则:
除了多对多联系的两个实体需映射为关系之外,多对多联系本身也需要映射为关系。这种新关系有两个外码,对应多对多联系中两个实体的外码。这两个外码就构成了这个新关系的复合主码。
用大学中,学生选修课这个例子来说明这种映射。
在这种多对多的联系中,一个学生可以选择多门课程,同样一门课程可以被多个学生选择。这时候就会新生成一张关系表select,其中的复合主码为student_id和subject_id分别为student表和subject表的主码。并且关系表也可以有自己的属性function。
下面是一个具体的实例样本:
student
student_id | name |
---|---|
s1 | 张三 |
s2 | 李四 |
s3 | 王五 |
subject
subject_id | subject_name |
---|---|
A | 唱 |
B | 跳 |
C | Rap |
D | 篮球 |
select
student_id | subject_id | function |
---|---|---|
s1 | C | 课代表 |
s1 | D | PG |
s3 | A | 爱豆 |
s3 | C | 搞笑担当 |
s3 | D |
1:1联系的映射
跟一对多联系类似,一对一联系也需要一个关系的外码指向另一个关系的主码,且由于基数比是1:1,因此可以随意挑选一个关系的主码作为另一个关系的外码。
但是当待选择的关系,有一个的外码是可选的,另一个外码是强制性时,通常选强制性的外码更可靠更高效。
例如人和身份证的关系,身份证是强制依赖于人的。因此将人的身份证号作为身份证的外码更为可靠。
参照完整性约束
定义:在包含外码的关系中,每一行的外码取值要么对应其参照关系中的主码取值,要么为空。
将拥有若干个候选码(多个唯一属性)的实体映射为关系
一个实体可以具有多个唯一属性,但是只能选择一个作为主码,其他属性只能作为非主码列。
非主码列可以在关系表中用(U)表示其唯一性。
当候选码中同时存在复合的和单一(非复合)候选码时,选非复合码将会是更好的选择。
将具有多值属性的实体映射为关系
多值属性将被映射为一个单独的关系,这个关系中包含一个代表多值属性的列和一个连接相应主码的外码列。
例如:一个用户有多个标签
用户ID | 用户名称 |
---|---|
1 | 吴彦祖 |
2 | 唐马儒 |
用户ID | 标签 |
---|---|
1 | 丑 |
1 | 屌丝 |
2 | 帅 |
2 | 男神 |
将具有派生属性的实体映射到关系
派生属性是那些属性值并非永久存储在数据库中到属性。派生属性的属性值是通过计算其他存储在数据库中的属性值而得到的。派生属性并不会被映射为关系模式的一部分。
一元联系的映射
一元映射:一个实体与另一个同类实体发生联系
1:M一元联系的映射
映射规则:一个由一对多一元联系实体映射得到的关系中包含一个外码,并且这个外码对应于关系自身的主码。
例如:父级关系就是一种一元联系
ID | 姓名 | ParentID |
---|---|---|
1 | 李大国 | |
2 | 李大宝 | 1 |
3 | 李二宝 | 1 |
4 | 李小明 | 1 |
M:N一元映射联系
映射规则:多对多联系本身需要映射为另一个关系。这个新关系有两个外码,它们由多对多联系中的两个实体的主码映射得到。其中每个外码都将作为新关系中复合主码的一部分。
例如有一种棋叫做斗兽棋,其遵循一种食物链关系:
棋子ID | 棋子名称 |
---|---|
1 | 象 |
2 | 狮 |
3 | 鼠 |
同类允许互相捕食,象不能吃鼠,鼠能吃象。
棋子ID | 被捕食棋子ID |
---|---|
1 | 1 |
1 | 2 |
2 | 2 |
2 | 3 |
3 | 1 |
3 | 3 |
1:1一元联系的映射
关联实体
与映射M:N联系的规则相同。创建一个带有外码的新关系,外码对应于表示参与关联实体的关系的主码。
弱实体
映射为带有一个外码的新关系,外码对应于表示主实体的关系的主码。由部分码映射得到的列和主实体的外码一起作为复合主码(如果没有部分码,外码单独作为主码。)
三元联系
与关联实体的映射规则相同。