数据库中表之间的关系
2016-06-13 16:49
190 查看
本文主要借MySQL数据库介绍数据库中表之间的关系。
=====================================================================
数据的原子性
原子性数据(Atomic Data)即为在能够准确描述事物的同时,最小块的数据。
对于一个字段(列)来说,若该列所包含的数据所符合原子性数据的要求,则该列中的数据不会存在多个类型相同的值,否则则该字段的数据不具有原子性。
如下表所示,其食材列则不具有原子性,因为该列包含了许多食材原料,如果想查找出含有某一原料的食物将显得非常麻烦,需要用到额外的字符串处理函数。
对于一张数据表来说,若该表符合原子性数据的要求,则其中不会同时存在多个相同数据类型的字段(列)。
如下表所示,改表中字段“学生1”,“学生2”,“学生3”和“学生4”都表示的是上某位老师课的学生的姓名,各个字段包含的其实是同类型的数据,因此,该表也不符合
下表为符合数据原子性的表。
主键-外键-组合键
主键(Primary Key)本身作为表中的一个字段存在,表中加入了主键后则可通过该列单独的识别(表示)一条记录,并且该条记录是唯一存在的。通常在实际工作中会采用添加人工主键方式(即认为构造如id= 1,2,3,。。。形式的标识)标识表中的每条记录。
设置主键的方法有多种:
CREATE TABLE your_table(
Field1 INT NOT NULL PRIMARY KEY AUTO_INCREMENT,
Field2 VARCHAR(10)……
); # PRIMARY KEY 告诉数据库将Field1字段作为主键
CREATE TABLE your_table(
Field1 INT NOT NULL AUTO_INCREMENT,
Field2 VARCHAR(10)……,
PRIMARY KEY(Field1)
); # PRIMARY KEY(Field1) 同样是告诉数据库将Field1字段作为主键
一张表的外键(Foreign Key)可以引用到另一张表的主键,和主键一样,外键也是数据表中的一个字段,因此其也代表了表中的一列。外键可以用于确认一张表中的某一条记录是否和另一张表中的某一条记录相对应。外键值不需要唯一,同时,外键也可以为NULL值。对于创建的外键可以通过采取提供约束的形式确保其的引用完整性,即能够对应相应的父表中的主键。
CREATE TABLE your_table1(
Field1 INT NOT NULL PRIMARY KEY AUTO_INCREMENT,
Field2 VARCHAR(10)……
); # PRIMARY KEY 告诉数据库将Field1字段作为主键
CREATE TABLE your_table2(
Field3 INT NOT NULL PRIMARY KEY AUTO_INCREMENT,
Field2 VARCHAR(10),
CONSTRAINT constraint_name
FOREIGN KEY(Field1)
REFERENCE your_table1(Field1)
); # 在your_table2中主键是Field3,
而“CONSTRAINT constraint_name
FOREIGN KEY(Field1)
REFERENCE your_table1(Field1)”
则表示将Field1设置为外键,同时对应表yout_table1的主键Field1,当然外键和其父表的主键并不强制要求要名称一样。
组合键即为由多个字段共同组成的主键。
对于下表:无法单一的使用姓名或者性别或者身高作为主键用来识别某一个记录,但是可以通过组合“名称+性别”的形式来形成组合键,通过这两列识别所有记录(这个例子给的表是特别为说明该概念设计的,并不是非常具有实际意义,考虑到实际性和可行性,更推荐人为设置人工键的方式)。
数据模式
数据库中的数据模式和前文提到的表与表之间的主外键的设置息息相关。总的来说共存在三种数据模式1对1(one to one),1对多(one to many)和多对多(many to many)。
1:1的模式,即一个表中的某条记录在另一个表中最多只能找到一条与它相对应的记录,同理另一个表只能在该表中找到一条对应记录。如下表A与表B中数据的对应关系即为1对1的关系,A表包含和人造主键工号id,姓名和外键身份证号,B表包含了主键身份证号和年龄信息。由于身份证号是唯一的,一个人只能有一个身份证号,一个身份证号也只能表示一个年龄,因此其对应关系只能是1对1(实际过程中一般会处于信息安全原因避免使用身份证号作为对应表与表的键)。
1:n的模式则表示一个表的某条记录能在另一个表中对应多条记录,但是另一个表中的某条记录只能在该表中对应一条记录。比如一个人名下可以拥有多个车牌,但是一个车牌只能对应一个注册人。
同理可推n:n模式即为一张表的某条记录可以对应多个存在于另一张表中的记录,同理另一张表中的某条记录也能对应该张表中的多条记录。如下表:每个人可以拥有多双鞋(n:n),同时一种鞋的购买者又可以是多个人(1:n),所以人和鞋的对应关系为多对多(n:n)。比如王五拥有表B中的所有鞋子,陈琪拥有耐科和锐不,邱钢拥有阿迪达是等等。
为了给这样的表之间建立清晰的对应关系,需要在其中间构建一个连接表(Junction Table)。
规范化
第一范式:
第一范式要求数据列只包含具有原子性的值,同时没有重复的数据组。
第二范式:
首先要满足第一范式,同时所有列都是主键的一部分,无部分函数依赖性(部分函数依赖性指非主键列依赖于组合键的某一部分— 依赖于组合键中的某一个列,随该列的变动而变动)。
第三范式:
首先要满足第二范式,同时不存在传递函数依赖性(传递函数依赖性即任何非健列于另一个非健列存在关联,随其变动而变动)。
=====================================================================
数据的原子性
原子性数据(Atomic Data)即为在能够准确描述事物的同时,最小块的数据。
对于一个字段(列)来说,若该列所包含的数据所符合原子性数据的要求,则该列中的数据不会存在多个类型相同的值,否则则该字段的数据不具有原子性。
如下表所示,其食材列则不具有原子性,因为该列包含了许多食材原料,如果想查找出含有某一原料的食物将显得非常麻烦,需要用到额外的字符串处理函数。
食物名称 | 食材 |
面包 | 面粉,牛奶,鸡蛋 |
牛肉面 | 牛肉,面条,香菜 |
。。。 | 。。。 |
对于一张数据表来说,若该表符合原子性数据的要求,则其中不会同时存在多个相同数据类型的字段(列)。
如下表所示,改表中字段“学生1”,“学生2”,“学生3”和“学生4”都表示的是上某位老师课的学生的姓名,各个字段包含的其实是同类型的数据,因此,该表也不符合
老师 | 学生1 | 学生2 | 学生3 | 学生4 |
赵一 | 李三 | 左四 | 陈五 | 龙六 |
王二 | 左四 | 龙六 | 何七 | 李三 |
。。。 | 。。。 | 。。。 | 。。。 | 。。。 |
下表为符合数据原子性的表。
食物 | 商户名称 | 厨师 | 价格 |
豆沙包 | 狗不理包子店 | 狗不理 | 1 |
牛肉面 | 老沙面条店 | 老沙 | 6 |
主键-外键-组合键
主键(Primary Key)本身作为表中的一个字段存在,表中加入了主键后则可通过该列单独的识别(表示)一条记录,并且该条记录是唯一存在的。通常在实际工作中会采用添加人工主键方式(即认为构造如id= 1,2,3,。。。形式的标识)标识表中的每条记录。
设置主键的方法有多种:
CREATE TABLE your_table(
Field1 INT NOT NULL PRIMARY KEY AUTO_INCREMENT,
Field2 VARCHAR(10)……
); # PRIMARY KEY 告诉数据库将Field1字段作为主键
CREATE TABLE your_table(
Field1 INT NOT NULL AUTO_INCREMENT,
Field2 VARCHAR(10)……,
PRIMARY KEY(Field1)
); # PRIMARY KEY(Field1) 同样是告诉数据库将Field1字段作为主键
一张表的外键(Foreign Key)可以引用到另一张表的主键,和主键一样,外键也是数据表中的一个字段,因此其也代表了表中的一列。外键可以用于确认一张表中的某一条记录是否和另一张表中的某一条记录相对应。外键值不需要唯一,同时,外键也可以为NULL值。对于创建的外键可以通过采取提供约束的形式确保其的引用完整性,即能够对应相应的父表中的主键。
CREATE TABLE your_table1(
Field1 INT NOT NULL PRIMARY KEY AUTO_INCREMENT,
Field2 VARCHAR(10)……
); # PRIMARY KEY 告诉数据库将Field1字段作为主键
CREATE TABLE your_table2(
Field3 INT NOT NULL PRIMARY KEY AUTO_INCREMENT,
Field2 VARCHAR(10),
CONSTRAINT constraint_name
FOREIGN KEY(Field1)
REFERENCE your_table1(Field1)
); # 在your_table2中主键是Field3,
而“CONSTRAINT constraint_name
FOREIGN KEY(Field1)
REFERENCE your_table1(Field1)”
则表示将Field1设置为外键,同时对应表yout_table1的主键Field1,当然外键和其父表的主键并不强制要求要名称一样。
组合键即为由多个字段共同组成的主键。
对于下表:无法单一的使用姓名或者性别或者身高作为主键用来识别某一个记录,但是可以通过组合“名称+性别”的形式来形成组合键,通过这两列识别所有记录(这个例子给的表是特别为说明该概念设计的,并不是非常具有实际意义,考虑到实际性和可行性,更推荐人为设置人工键的方式)。
名称 | 性别 | 身高 |
王权 | 男 | 180 |
王强 | 女 | 170 |
王鑫 | 男 | 186 |
王鑫 | 女 | 166 |
李崇 | 女 | 166 |
。。。 | 。。。 | 。。。 |
数据库中的数据模式和前文提到的表与表之间的主外键的设置息息相关。总的来说共存在三种数据模式1对1(one to one),1对多(one to many)和多对多(many to many)。
1:1的模式,即一个表中的某条记录在另一个表中最多只能找到一条与它相对应的记录,同理另一个表只能在该表中找到一条对应记录。如下表A与表B中数据的对应关系即为1对1的关系,A表包含和人造主键工号id,姓名和外键身份证号,B表包含了主键身份证号和年龄信息。由于身份证号是唯一的,一个人只能有一个身份证号,一个身份证号也只能表示一个年龄,因此其对应关系只能是1对1(实际过程中一般会处于信息安全原因避免使用身份证号作为对应表与表的键)。
表A | | 表B | ||||
工号id(主键) | 姓名 | 身份证号(外键) | | 身份证号(主键) | 年龄 | 工号id |
1 | 王五 | 12334 | | 12334 | 23 | 1 |
2 | 陈琪 | 22234 | | 22234 | 32 | 2 |
3 | 邱钢 | 32234 | | 32234 | 34 | 3 |
。。。 | 。。。 | 。。。 | | 。。。 | 。。。 | |
1:n的模式则表示一个表的某条记录能在另一个表中对应多条记录,但是另一个表中的某条记录只能在该表中对应一条记录。比如一个人名下可以拥有多个车牌,但是一个车牌只能对应一个注册人。
表A | | 表B | |||
id(主键) | 姓名 | 注册人id(外键) | | 注册人id(主键) | 车牌号码 |
1 | 王五 | 1 | | 1 | 1234 |
2 | 陈琪 | 2 | | 1 | 1231 |
3 | 邱钢 | 3 | | 2 | 2343 |
4 | 。。。 | 。。。 | | 3 | 4532 |
。。。 | 。。。 | 。。。 | | 。。。 | 。。。 |
同理可推n:n模式即为一张表的某条记录可以对应多个存在于另一张表中的记录,同理另一张表中的某条记录也能对应该张表中的多条记录。如下表:每个人可以拥有多双鞋(n:n),同时一种鞋的购买者又可以是多个人(1:n),所以人和鞋的对应关系为多对多(n:n)。比如王五拥有表B中的所有鞋子,陈琪拥有耐科和锐不,邱钢拥有阿迪达是等等。
表A | | 表B | ||
id(主键) | 姓名 | | 鞋子id(主键) | 品牌 |
1 | 王五 | | 1 | 耐科 |
2 | 陈琪 | | 2 | 锐不 |
3 | 邱钢 | | 3 | 阿迪达是 |
4 | 斯研 | | 4 | 特不 |
。。。 | 。。。 | | 。。。 | 。。。 |
表A | | 表C | | 表B | |||
id(主键) | 姓名 | | id | 鞋子id | | 鞋子id(主键) | 品牌 |
1 | 王五 | | 1 | 2 | | 1 | 耐科 |
2 | 陈琪 | | 1 | 3 | | 2 | 锐不 |
3 | 邱钢 | | 1 | 。。。 | | 3 | 阿敌 |
4 | 斯研 | | 2 | 3 | | 4 | 特不 |
。。。 | 。。。 | | 2 | 4 | | 。。。 | 。。。 |
。。。 | 。。。 | | 。。。 | 。。。 | | 。。。 | 。。。 |
规范化
第一范式:
第一范式要求数据列只包含具有原子性的值,同时没有重复的数据组。
第二范式:
首先要满足第一范式,同时所有列都是主键的一部分,无部分函数依赖性(部分函数依赖性指非主键列依赖于组合键的某一部分— 依赖于组合键中的某一个列,随该列的变动而变动)。
第三范式:
首先要满足第二范式,同时不存在传递函数依赖性(传递函数依赖性即任何非健列于另一个非健列存在关联,随其变动而变动)。