一、数据库的设计
多表间关系
1. 一对一
如:人与身份证 分析:一个人对应一个身份证,一个身份证对应一个人
2. 一对多(多对一)
如:部门和员工 分析:一个部门有多个员工,一个员工对应一个部门
3. 多对多
如:学生和课程 分析:一个学生可以选择多门课程,一门课程可以被多个学生选择
实现一对多(多对一)
如:员工和部门。
实现方式:
在多的一方建立外键,指向一的一方的主键
实现多对多
如:学生与选课。
实现方式:
多对多关系实现需要借助第三张中间表。中间表至少包含两个字段,这两个字段
作为第三张表的外键,分别指向两张表的主键{中间表中的主键关系是成对出现且不重复的,这种形式称为联合主键}
实现一对一
如:人和身份证。
实现方式:
可以在任意一方添加唯一外键指向另一方的主键
{一对一用的不多,因为可以合并}
利用数据库,在后台实现多表、元组的修改
案例一:
案例场景:
一个用户上旅游网页收藏旅游线路
案例中实体分析:
用户实体{主键列,名字列,密码列};
线路实体{主键列,名字列,价格列};
旅游线路分类实体{主键列,名字列}
实体间关系分析:
一个旅游线路分类对应多个线路,一个线路对应一个旅游线路分类;
一个用户可以收藏多个线路,一个线路可以被多个用户收藏
实体间外键设置:
一对多{在多的一方设置外键指向一的一方},
多对多{引入第三张表,实现两张主表中主键间的对应关系}
SQL语句实现:
创建分类线路表:
CREAT TABLE tab_category(
cid INT PRIMARY KEY AUTO_INCREMENT,
cname VARCHAR(100) NOT NULL UNIQUE
);
旅游线路表:
CREAT TABLE tab_route(
rid INT PRIMARY KEY AUTO_INCREMENT,
rname VARCHAR(100) NOT NULL UNIQUE,
price DOUBLE, rdate DATE, cid INT,
CONSTRAINT 外键名称 FOREIGN KEY (cid) REFERENCES tab_category
);
用户表:
CREATE TABLE tab_user(
uid INT PRIMARY KEY AUTO_INCREMENT,
username{用户昵称} VARCHAR(100) UNIQUE NOT NULL,
upassword VARCHAR(30) NOT NULL,
uname{用户姓名} VARCHAR(100),
birthday DATE,
sex CHAR(1) DEFAULT '男',
telephone VARCHAR(11),
email VARCHAR(100
);
用户和线路的中间表:
CREATE TABLE tab_favorite(
rid INT, data DATETIME{收藏时间},
uid INT {-- 创建复合主键}PRIMARY KEY(rid,uid),
FOREIGN KEY(rid) REFERENCES tab_route(rid),
FOREIGN KEY(uid) REFERENCES tab_user(uid)
);