数据库设计

三种关系
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)。

原文地址:https://www.cnblogs.com/isdom/p/webclips045.html