本章小编将叙述怎么依据一个详细的需求来规划一个简略、便利且合理的数据库,话不多说,下面就让小编带大家走进本章内容。
一、需求
假设要依据某大学计算机学院成果办理的事务规矩规划一个数据库的概念模型,这个学院的事务规矩如下:
- 1、该学院聘用多名教师,但每一位教师只归于该学院。教师包括教工号、名字、学历、职称、薪酬、电话号码信息。
- 2、一位教师可能讲多门课,每一门课可由多位教师教学。课程包括课程号、课程称号、学时数和学分信息,每门课程可存在一门先行课程。
- 3、该学院有多名学生,且每一名学生只能归于该学院。学生包括学号、名字、性别、出生年月、专业、原籍、电话号码信息。
- 4、每一名学生可选修多门课,且一门课有多名学生选;学生所修课程的成果包括平时成果与期末成果。
二、E-R图
看到上述需求不用多想,在ER图中必定存在教师、学生、课程、学院这四个实体以及实体在需求中对应的特点,至于实体之间的联系,咱们可以经过需求中两个实体之间的动词来判断,如:归于、教学、选修等。 咱们就需求考虑两个实体间联系的特点是否需求或者是应该包括哪些特点。例如:授课学期这个特点,或许会被放在教师这个实体中,当成教师的特点,可是得想想:一般情况下,数据库里的记载一般是不会删除的,而教师这个人物又是每年都会授课,这就会导致每次增加教师授课记载时,还需求将教师的教师编号、名字、学历等根本信息也都增加一次,显然,这是不符合实践需求的,在实践中,咱们只要记载的是教师在某某年份上的课程,而不是彻底的、再次记载教师根本信息加某年的授课记载。因而,授课学期这个特点应该放在授课这个联系中,而不是放在教师这个实体中。 在考虑完ER图中各个实体间的联系及特点后,咱们还应该考虑各个实体间的代数联系,如:一对一、一对多、多对多等等。这里小编就拿教师与学院举例,在日常生活中,一个学院可以包括多个教师,可是呢一个教师归于一个学院,因而这里是一个一(学院)对多(教师)的联系。
三、联系模式
所谓的联系模式实践上便是数据表,也便是咱们树立数据库时创立的数据表。 在写联系模式时,咱们首先要明确一点是:在ER图中,实体与多对多的联系都需求使用一个联系来表明, 除此之外,还可以可以正确表达需求的基础上恰当增加一些合理的联系模式使得该数据库更加完善。 那么怎么挑选一个适宜的主码呢?将一个字段设置成主码的前提因素便是该字段的仅有性,像下述联系模式中的学院号、学号、教师工号等都是一个仅有的值,因而用作主码再适宜不过。或者,在设置主码时不用一个字段作为主码,而是挑选多个字段作为主码,如在授课表中,由于同一个教师每个学期都需求上相同或不同的课,因而在该表中教师工号与课程号都有相同的可能,那咱们加上授课学期作为主码,那不就完美解决这个问题了嘛。 因而,上述ER图的联系模式给出如下:
- 学院(学院号,学院称号)主码:学院号
- 教师(教师工号,名字,学历,年纪,职称,薪酬,电话,学院号) 主码:教师工号 外码:学院号
- 学生(学号、名字、性别、出生年月、专业、原籍、电话、学院号) 主码:学号 外码:学院号
- 课程(课程号、课程称号、课程时数、课程学分、先行课程号) 主码:课程号 外码:先行课程号
- 授课(教师工号、课程号、授课学期) 主码:课程号、授课学期、教师工号 外码:教师工号、课程号
- 选课(学号、课程号、上课学期、平时成果、期末成果) 主码:学号、课程号、上课学期 外码:学号、课程号
四、在MySQL中创立一个数据库
1、使用 create database +数据库称号 创立一个数据库
# 创立一个名字为workPlace的数据库
create database workPlace;
2、使用create table +表名+字段(字段名 字段类型 字段的约束修饰) 在校园表中,咱们将校园的编码设置成主码,将校园称号设置成仅有值的约束,这样即使校园称号不为主码也能保证该字段不呈现重复的值。
#创立校园表
CREATE TABLE `school` (
`schoolcode` varchar(20) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL COMMENT '学院编码',
`schoolname` varchar(30) CHARACTER SET utf8 COLLATE utf8_general_ci DEFAULT NULL COMMENT '学院称号',
PRIMARY KEY (`schoolcode`) USING BTREE,
UNIQUE KEY `schoolName` (`schoolname`) USING BTREE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb3;
在学生表中,咱们将学号设置成主码,将学院编号设置成外码,该外码参照的是校园表。
# 创立一个学生表
CREATE TABLE `student` (
`sno` varchar(20) NOT NULL COMMENT '学号',
`sname` varchar(15) NOT NULL COMMENT '名字',
`ssex` varchar(10) DEFAULT NULL COMMENT '性别',
`stime` date DEFAULT NULL,
`location` varchar(20) CHARACTER SET utf8 COLLATE utf8_general_ci DEFAULT NULL COMMENT '原籍',
`major` varchar(20) NOT NULL COMMENT '专业',
`sphonenumber` varchar(11) DEFAULT NULL COMMENT '电话',
`schoolcode` varchar(20) NOT NULL COMMENT '学院编号',
PRIMARY KEY (`sno`) USING BTREE,
KEY `schoolcode` (`schoolcode`),
CONSTRAINT `student_ibfk_1` FOREIGN KEY (`schoolcode`) REFERENCES `school` (`schoolcode`) ON DELETE CASCADE ON UPDATE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb3;
在教师表中,咱们将教职工号设置成主码,将校园编码设置成参照校园表的外码。
# 创立教师表
CREATE TABLE `teacher` (
`id` varchar(15) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL COMMENT '教职工号',
`name` varchar(20) NOT NULL COMMENT '教师名字',
`education` varchar(255) DEFAULT NULL,
`title` varchar(20) DEFAULT NULL COMMENT '教师职称',
`salary` float DEFAULT NULL COMMENT '教师薪酬',
`age` varchar(0) DEFAULT NULL COMMENT '教师年纪',
`phonenumber` varchar(11) DEFAULT NULL COMMENT '教师电话',
`schoolcode` varchar(20) NOT NULL COMMENT '学院编码',
PRIMARY KEY (`id`,`schoolcode`),
KEY `schoolcode` (`schoolcode`),
KEY `id` (`id`),
CONSTRAINT `teacher_ibfk_1` FOREIGN KEY (`schoolcode`) REFERENCES `school` (`schoolcode`) ON DELETE CASCADE ON UPDATE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb3;
在课程表中,咱们将课程编号设置成主码,而先行课程号设置成参照自己的外码。
CREATE TABLE `course` (
`id` varchar(20) NOT NULL COMMENT '课程编号',
`name` varchar(20) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL COMMENT '课程称号',
`time` varchar(10) NOT NULL COMMENT '课程时数',
`score` varchar(10) NOT NULL COMMENT '课程学分',
`beforeid` varchar(20) DEFAULT NULL COMMENT '先行课程号',
PRIMARY KEY (`id`),
KEY `course_ibfk_1` (`beforeid`),
CONSTRAINT `course_ibfk_1` FOREIGN KEY (`beforeid`) REFERENCES `course` (`id`) ON DELETE CASCADE ON UPDATE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb3;
在选课表中,将课程编号、学号、上课时刻三者设置成一个联合主键,再将学号设置成参照学生表的外码,将课程编号设置成参照课程表的外码
#选课表
CREATE TABLE `sc` (
`cid` varchar(20) NOT NULL COMMENT '课程编号',
`time` varchar(20) NOT NULL COMMENT '上课时刻',
`sno` varchar(20) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL COMMENT '学号',
`usualgrade` int DEFAULT NULL COMMENT '课程成果',
`examgrade` int DEFAULT NULL COMMENT '期末成果',
PRIMARY KEY (`sno`,`cid`,`time`),
KEY `cid` (`cid`),
CONSTRAINT `sc_ibfk_1` FOREIGN KEY (`sno`) REFERENCES `student` (`sno`) ON DELETE CASCADE ON UPDATE CASCADE,
CONSTRAINT `sc_ibfk_2` FOREIGN KEY (`cid`) REFERENCES `course` (`id`) ON DELETE CASCADE ON UPDATE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb3;
在授课表中,将课程编号、授课时刻、教职工号三者设置成一个联合主键,将课程编号设置成参照课程表的外码,将教职工号设置成参照教师表的外码。
#授课表
CREATE TABLE `tc` (
`cid` varchar(20) NOT NULL COMMENT '课程编号',
`time` varchar(20) NOT NULL COMMENT '授课时刻',
`tid` varchar(15) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL COMMENT '教职工号',
PRIMARY KEY (`tid`,`cid`,`time`),
KEY `cid` (`cid`),
CONSTRAINT `tc_ibfk_1` FOREIGN KEY (`tid`) REFERENCES `teacher` (`id`) ON DELETE CASCADE ON UPDATE CASCADE,
CONSTRAINT `tc_ibfk_2` FOREIGN KEY (`cid`) REFERENCES `course` (`id`) ON DELETE CASCADE ON UPDATE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb3;
最后,小编在此处附上一篇关于数据库怎么操作的文章 mysql数据库的根本操作