全部章节 >>>>
本章目录
2.1 关系模型与数据表
2.1.1 关系模型
关系模型是由若干个关系模式组成的集合,关系模式的实例称为关系,每个关系实际上是一张二维表格。
关系模型用键导航数据,其表格简单。
订单号 | 客户 ID | 下单时间 | 订单金额 | 订单状态 |
DD201805200001 | C10001 | 2018-5-2019:20:03 | 322.5 | 商品出库 |
DD201805220001 | C10003 | 2018-5-229:13:20 | 530 | 物流揽收 |
DD201805220002 | C10002 | 2018-5-2214:42:31 | 123.56 | 发往目的地 |
DD201805260002 | C10001 | 2018-5-2610:13:25 | 210.2 | 客户签收 |
关系数据库是以关系模型为基础的数据库,是一种根据表、元组(记录)以及字段(列)之间的关系进行组织和访问数据的数据库,其通过若干个表来存取数据,并且通过关系将这些表联系在一起。
关系模型中的术语:
- 关系(Relation)对应通常所说的一张表,如订单表。
- 元组(Tuple)表中的一行即为一个元组,它可以标识实体集中的一个实体,元组亦可称作“记录(Record)”。表中任意两行(元组)不能相同。
- 属性(Attribute)表中的一列即为一个属性,给每个属性起一个名称即属性名,属性亦可称作列(Column),表中的属性名(列名)不能相同,每个属性都有值。
- 主键(Key)表中的某个属性组,它可以唯一确定一个元组,属性组可以有一个或多个属性。
- 关系模式:对关系的描述,可表示为关系名。
2.1.2 数据表
对于关系型数据库而言,一张表就是一个关系
在数据库中,数据表是数据存储的基本单位,是数据库中最重要、 最基本的操作对象。
数据表被定义为列的集合, 数据在表中是按照行和列的格式来存储的。
每一行代表一条唯一的记录,每一列代表记录中的一个域。
2.2 MySQL 数据类型
2.2.1 MySQL 常见数据类型
类型分类 | 类型 | 取值范围或描述 | 示例 |
整数类型 | tinyint | 0 ~255 | 员工年龄:32 |
smallint | -32768~32767 | 员工数:2540 | |
int | -2147483648~2147483647 | 中国人口数:1354040000 | |
小数类型 | decimal | decimal(5,2)表示小数的取值范围是-999.99~999.99 | 商品单价:892.35 |
定长字符串类型 | char | char(10) 表示字符串存储 10 个字符,即便该字符串只有一个字符, 它所占用的存储空间也是 10 个字符空间大小 | 公司名:HUAWEI |
变长字符串类型 | varchar | varchar(10) 表示字符串最多存储10 个字符,如果该字符串仅包含一个字“中”,那么它所占用的存储空间也只是一个字符空间大小。定义 varchar 类型可节省存储空间 | 公司地址:武汉洪山区珞瑜路 546 路光谷科技会展中心 |
类型分类 | 类型 | 取值范围或描述 | 示例 |
日期类型 | date | 格式:YYYY-MM-DD(年 - 月- 日)取值范围:1000-01-01 ~ 9999-12-31 | 出生日期:1982-03-24 |
日期类型 | time | 格式:HH:MM:SS(时 : 分钟 : 秒)取值范围:-838:59:59 ~ 838:59:59 注意:时间不限当天 | 早晨上班时间:08:30:00 |
datetime | 格式:YYYY-MM-DD HH:MM:SS 取 值 范 围:1000-01-01 00:00:00 ~ 9999-12-31 23:59:59 | 登 机 时 间:2015-05-1214:35:0 |
2.2.2 使用 Navicat for MySQL 创建数据表结构
数据库 bus 中公交线路表line
线路号 | 所属分公司 | 起点站 | 终点站 | 线路长度(km) | 车辆数 |
502 | 公交六公司 | 黄州街 108 街坊 | 桥口码头 | 23.7 | 15 |
503 | 公交二公司 | 文馨街文昌街口 | 沿江大道青岛路口 | 22.5 | 20 |
541 | 公交三公司 | 江盛路长江紫都 | 长丰大道东风村 | 27.3 | 17 |
605 | 公交三公司 | 古田二路翠堤春晓 | 梨园广场 | 24.4 | 16 |
607 | 公交四公司 | 园林路钢都花园 | 玉龙路朱家亭 | 28.2 | 19 |
609 | 公交五公司 | 沿河大道桥口码头 | 南湖公交场站 | 18.2 | 14 |
620 | 公交二公司 | 康居五路 | 汉黄路岱家山 | 16.2 | 12 |
线路表表结构
字段名 | 说 明 | 类 型 | 长 度 |
lineNo | 线路号 | varchar | 10 |
company | 所属分公司 | varchar | 20 |
from_station | 起点站 | varchar | 20 |
to_station | 终点站 | varchar | 20 |
miles | 线路长度 | decimal(3,1) | — |
number | 车辆数 | smallint | — |
线路号虽然显示为数字,但不宜采用数字类型,只能是字符串类型。因为线路号与身份证号类似,不仅有一定的编码规则,还可能出现字母。
利用 Navicat for MySQL 创建表
使用 Navicat for MySQL 维护数据表结构
2.3 数据完整性约束
2.3.1 数据完整性
为了防止不符合规范的数据进入数据库,在用户对数据进行插入、修改以及删除等操作时,DBMS 自动按照一定的约束条件对数据进行监测,使不符合规范的数据不能进入数据库,以确保数据库中存储的数据正确、有效、相容。
数据完整性用于保证数据库中的数据在逻辑上的一致性、正确性和可靠性。
数据完整性主要包含:实体完整性、域完整性和参照完整性。
2.3.2 实体完整性约束
实体完整性规定表的每一行记录在表中是唯一的
实体完整性主要包含主键约束和唯一约束。
主键约束(Primary Key Constraint)用于唯一识别每一条记录,数据表中具有唯一值的字段可设定为主键字段。
主键选择策略:工程实践所推荐的做法是:新增一个无业务含义的字段作为主键,该字段为整数类型,且字段值自动增长。
线路表主键选择:在线路表中新增一个 int 类型的字段“线路编号(lineID)”,将该字段设置为主键且自动增长。当“线路编号”设置为自动增长时,则每次新增线路的“线路编号”值将从 1 开始,且每次递增 1。
在线路表中设置主键和主键自增长的具体做法如下:
- 新增字段“线路编号(lineID)”,设置该字段为 smallint 类型。
- 选中字段“lineID”,单击“
”,即设置“lineID”为主键,并勾选“自动递增”。
每个数据表只能有一个主键。设定为主键的字段内容不能有重复值,且不能为 null 值。
唯一约束(Unique Constraint):如果某个字段满足唯一性约束要求,则可以向该字段添加唯一性约束。
与主键约束相比,唯一约束也用于确保列中不存在重复值,但其列值可以是 null。
在线路表的“lineNo”上设置唯一约束:
主键约束要求列值非空,而唯一键约束允许列值为空。
2.3.3 域完整性
域完整性指给定列输入的有效性,即保证指定列的数据具有正确的数据类型、格式和有效的数据范围。
域完整性主要包含非空约束、默认值约束。
非空约束(Not Null Constraint):如果某个字段满足非空约束的要求,则应该在字段上设置非空约束。
示例:在线路表“所属公司”设置非空约束,只需在线路表设计窗口中选中“company”,取消勾选“允许空值”即可。
默认值约束(Default Constraint):如果某个字段满足默认值约束的要求,可向该字段添加默认值约束。
示例:在“company”列上设置默认值约束,默认值为“公交二公司”。
2.4 参照完整性约束
2.4.1 外键
在公交管理系统中规定营运车辆都隶属于某个具体的公交线路。因此应在车辆表设计一个字段,该字段与线路表的主键 lineID 的数据类型和长度大小应完全一致,并且值也参照线路表中的主键值。
这种参照其他表中主键的字段称为外键。
2.4.2 参照完整性定义
参照完整性是指通过定义一张表中外键与另一张表中主键之间的引用规则来约束这两张表之间的联系。
参照完整性的目的:
- 利用关联表之间的制约机制互相参照,控制表间数据的一致性和完整性。这种制约机制会在用户执行插入、修改或删除记录等编辑记录的操作时,发挥其限制作用。参照完整性有效地限制了对表中数据的非法编辑,参照完整性的实质就是不允许在相关数据表中引用那些不存在的记录。
参照完整性相关术语:
- 从表:含有外键且参照其他表的表,如车辆表。从表亦称作“子表”或“参照表”。
- 主表:被其他表参照的表,如线路表。主表亦称作“父表”或“被参照表”。
- 外键:从表中的参照列称为外键,外键名与被参照的主表中的主键数据类型应完全一致,但可以不同名。如车辆表中的字段“线路”。
- 被参照列:主表中的被参照列通常为主表的主键(也可以为唯一键)。如表的主键 lineID 为被参照列。
(1)参照完整性实现方法:通过定义外键与主键之间的对应关系来实现。
(2)参照完整性作用:保证从表中数据与主表中数据的一致性。当增加、修改或删除数据表中的记录时,可以借助参照完整性来保证相关联表之间数据的一致性。
2.4.3 设置外键约束实现参照完整性
公交车辆表 vehicle 的表结构:
字段名 | 说明 | 类型 | 长度 | 约束 |
vehicleID | 车辆编号 | int | — | 主键、自动增长 |
plateNo | 车牌号 | varchar | 10 | 非空 |
model | 型号 | varchar | 20 | — |
type | 类型 | varchar | 20 | 普通车、空调车 |
lineID | 线路编号 | int | — | 外键,参照 line 表 |
使用 Navicat for MySQL 在 vehicle 表的 lineID 上设置外键
测试添加从表数据一致性问题
总结:
- 数据完整性确保数据库中存储的数据正确、有效和相容。
- 数据完整性包括实体完整性、域完整性和参照完整性。
- 实体完整性约束包括主键约束和唯一约束。
- 域完整性约束包括非空约束和默认值约束。
- 参照完整性是指通过定义一张表中外键与另一张表中主键之间的引用规则来约束这两张表之间的联系。
- 参照其他表主键或唯一约束列的字段称为外键,外键用于实现参照完整性。包含外键的表称为从表或子表。