数据库设计
三种关系
1:1 一对一对应 x中的一个实体最多与y中一个实体关联,y中一个实体最多与x中一个实体关联
1:N 一对多 X中一个实体与y中任意数量实体关联, y中一个实体最多与x中一个实体关联
N:1 多对一 x中一个实体最多与y中一个实体关联, y中一个实体与x中任意数量的实体关联
M:N 多对多 x中一个实体与y中任意多个实体关联,y中一个实体与x中任意多个实体关联
建表时:
(x)1 : 1(y) x表和y表,各自建主键(pk)
(x)1 : n(y) x表和y表,各自建主键(pk),y表建外键(fk)关联x表主键
(x)n : 1(y) x表和y表,各自建主键(pk),x表建外键(fk)关联y表主键
(x)m : n(y) x表和y表,各自建主键(pk),再建一个中间表x_y表(x,y关系表)建主键,再建两列外键和x表和y表关联
note:更新主外键关系表时,需先操作对应从表记录,再操作主表记录
第一范式:
每列的原子性 (每列的属性值不可再分)
第二范式:
表中每列都与主键相关 (比如房间号是主键, 房间描述,客房状态,床位数,价格等组成一个完整的客房实体,其它列都依赖于主键)
第三范式:
在第二范式的基础上更进一层,要求其它列和主键直接相关,而不是间接相关,根据依赖传递的理论,比如房间号->房间类型->价格 (此时价格和房间号属于间接相关,需要拆分表)
外键:
外键: (外键列会在建立外键时自动创建btree索引)
语法:
create table temp(
id int,
name char(20),
foreign key(id) references outTable(id) on delete cascade on update cascade);
alter table 'xx' add 'xx' int not null after 'descr';
alter table '表名' add constraint 约束名 约束类型 具体约束说明
alter table xx表 add constraint fk_user_id foreign key (user_id) references user(id);
删除外键
语法: ALTER TABLE table-name DROP FOREIGN KEY key-id;
例: ALTER TABLE `tb_active` DROP FOREIGN KEY `FK_ID`
更新和删除外键关系的实体时的行为
on update on delete
RESTRICT(限制外表中的外键改动)
CASCADE(跟随外键改动)
SET NULL(设空值)
SET DEFAULT(设默认值)
NO ACTION(无动作,默认的)
note:
on delete:
当取值为No Action或者Restrict时,则当在父表(即外键的来源表)中删除对应记录时,
首先检查该记录是否有对应外键,如果有则不允许删除。
当取值为Cascade时,则当在父表(即外键的来源表)中删除对应记录时,首先检查该记录是否有对应外键,
如果有则也删除外键在子表(即包含外键的表)中的记录
当取值为Set Null时,则当在父表(即外键的来源表)中删除对应记录时,首先检查该记录是否有对应外键,
如果有则设置子表中该外键值为null(不过这就要求该外键允许取null)。
on update:
当取值为No Action或者Restrict时,则当在父表(即外键的来源表)中更新对应记录时,
首先检查该记录是否有对应外键,如果有则不允许更新。
当取值为Cascade时,则当在父表(即外键的来源表)中更新对应记录时,首先检查该记录是否有对应外键,
如果有则也更新外键在子表(即包含外键的表)中的记录。
当取值为Set Null时,则当在父表(即外键的来源表)中更新对应记录时,首先检查该记录是否有对应外键,
如果有则设置子表中该外键值为null(不过这就要求该外键允许取null)。