数据库设计之E-R图和关系表

一 概念

E-R:也称实体-联系图(Entity Relationship Diagram),提供了表示实体类型、属性和联系的方法,用来描述现实世界的概念模型。

实体:用矩形框表示,矩形框内写明实体名称

实体属性:用椭圆图框或圆角矩形表示

关系:用菱形框表示实体之间的关系,在菱形框内写明关系名,分别与有关实体连接起来,同时在实心线段旁标上关系的类型(1:1,1:N或M:N)

关系表:将E-R图转换成关系表,并定义列类型,建立主键、外键等各种约束。

二 E-R图

下边我们以大家最为熟悉的一个应用场景——学校系统(学生、课程、老师、学生证)为例,设计一个E-R图,如下:

说明:

  1. 图中定义了4个实体和3个关系,实体分别是学生、学生证、老师和课程。
  2. 实体的属性如图中各个椭圆所示。
  3. 3组关系:学生与学生证的一对一入学关系(每个学生入学时,办理唯一的学生证);课程与老师之间的一对多任教关系(此处为了便于说明1对多关系,假设学校只允许一个老师教一门课程,但一门课程可以有多个老师任教);课程与学生之间的多对多关系(每个课程可以有多个学生学习,每个学生可以选择多门课程)。

 三 关系表

完成了E-R图设计后,下边就可以设计关系表了,如下步骤:

  1. 数据库选型,常用的数据库MySQL,SQL Server,Oracle等。各种数据库支持的字段类型略有不同,所以在物理表设计之前要完成数据库选型。下边我们以开源数据库MySQL为例,进行建表。
  2. 将每个实体转换成一个数据表,将实体的属性转换为该表中的列,为每个列定义相应的数据类型。
  3. 对于1:1关系的两个表,给两个表设置相同的主键列。
  4. 对于1:N关系的两个表,在N表中添加一个外键列,该列与1标的主键相关联。
  5. 对于M:N关系,生成一个单独的表表示该关系,该关系的列由两个表的主键组成。
  6. 重新审核所有的表,在需要的地方添加约束,对常用的条件字段设置索引。

通过以上步骤,可以将E-R图中的实体关系模型转换成具体的关系表。该图一共生成了5个表:4个实体表和1个关系表。

课程表

表名:t_course

表的作用:定义实体课程

列名

类型

索引、约束

作用及备注

id

INT

PK

唯一标识

title

TEXT

NOT NULL

课程名

period

INT

Index

学时

description

TEXT

课程描述

老师表

表名:t_teacher

表的作用:定义实体老师

列名

类型

索引、约束

作用及备注

id

INT

PK

唯一标识

name

TEXT

NOT NULL

姓名

gender

BOOL

Index

性别

True:男

False:女

address

TEXT

住址

course_id

INT

FK:t_course.id

由于1:N关系添加的外键

学生表

表名:t_student

表的作用:定义实体学生

列名

类型

索引、约束

作用及备注

student_id

INT

PK

唯一标识

name

TEXT

NOT NULL

姓名

age

INT

Index

年龄

parent

TEXT

家长

学生证表

表名:t_card

表的作用:定义实体学生证

列名

类型

索引、约束

作用及备注

student_id

INT

PK

学号,唯一标识

start_from

datetime

注册日期、入学日期

end_to

datetime

学生证有效期截止日期

学生课程关系表

表名:t_enroll

表的作用:定义关系学生:课程

列名

类型

索引、约束

作用及备注

student_id

INT

PK,FK:t_student.student_id

学生标识

course_id

INT

PK,FK:t_course.id

课程标识

说明:

Index:索引,是对数据库表中一列或多列的值进行排序的一种结构。对常用的查询条件字段添加索引可以显著提高SQL语句的性能。

Constraint:约束,是对列数据取值的某种限定。常见的约束有主键、外键、非空、唯一等。

PK:主键(Primary Key),唯一标识一条记录,不允许为空。在大多数数据库中主键列也是一个索引列。

FK:外键(Foreign Key),是另一个表的主键,表示关联关系,可以是空字段。

NOT NULL:非空约束,表示不允许列值为空。

四 SQL语句

关系表设计好之后,创建表格的SQL语句,也就水到渠成了,下边是以上5个关系表对应的建表mysql语句。注意mysql引擎使用的是InnoDB,字符集是utf-8。

课程表

//课程表
CREATE TABLE `t_course` (
  `id` int(11) NOT NULL,
  `title` text NOT NULL,
  `period` int(11) DEFAULT NULL,
  `description` text,
  PRIMARY KEY (`id`),
  KEY `idx_period` (`period`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

老师表

//老师表
CREATE TABLE `t_teacher` (
  `id` int(11) NOT NULL,
  `name` text NOT NULL,
  `gender` int(11) DEFAULT NULL,
  `address` text,
  `course_id` int(11) DEFAULT NULL,
  PRIMARY KEY (`id`),
  KEY `gender` (`gender`),
  KEY `course_id` (`course_id`),
  CONSTRAINT `course_id` FOREIGN KEY (`course_id`) REFERENCES `t_course` (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

学生表

//学生表
CREATE TABLE `t_student` (
  `student_id` int(11) NOT NULL,
  `name` text NOT NULL,
  `age` int(11) DEFAULT NULL,
  `parent` text,
  PRIMARY KEY (`student_id`),
  KEY `age` (`age`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

学生证表

//学生证表
CREATE TABLE `t_card` (
  `student_id` int(11) NOT NULL,
  `start_from` datetime DEFAULT NULL,
  `end_to` datetime DEFAULT NULL,
  PRIMARY KEY (`student_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

学生课程关系表

//学生:课程关系表
CREATE TABLE `t_enroll` (
  `student_id` int(11) NOT NULL,
  `course_id` int(11) NOT NULL,
  PRIMARY KEY (`student_id`,`course_id`),
  CONSTRAINT `student_id` FOREIGN KEY (`student_id`) REFERENCES `t_student` (`student_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

五 参考文献

《Python高效开发实战》(刘长龙)

### 回答1: CentOS 7启动httpd服务失败可能有多种原因,以下是一些常见的解决方法: 1. 检查httpd配置文件是否正确:可以使用命令`httpd -t`检查httpd配置文件是否正确,如果有错误,需要修改配置文件。 2. 检查端口是否被占用:可以使用命令`netstat -tlnp`查看端口是否被占用,如果被占用需要释放端口或修改httpd配置文件中的端口号。 3. 检查httpd服务是否安装:可以使用命令`rpm -qa | grep httpd`查看httpd服务是否安装,如果没有安装需要先安装httpd服务。 4. 检查httpd服务是否启动:可以使用命令`systemctl status httpd`查看httpd服务是否启动,如果没有启动需要使用命令`systemctl start httpd`启动httpd服务。 5. 检查SELinux是否开启:如果SELinux开启,可能会导致httpd服务启动失败,需要使用命令`setenforce 0`关闭SELinux,或者修改SELinux策略。 以上是一些常见的解决方法,如果以上方法都无法解决问题,可以查看httpd服务日志文件,找到具体的错误信息,然后根据错误信息进行解决。 ### 回答2: CentOS 7上的httpd服务启动失败可能有多种原因。以下列出了一些常见问题和解决方法: 1. 端口被占用 当httpd试图占用已被其他程序占用的端口时会启动失败。此时可以通过使用`netstat -tunlp`命令检查端口占用情况,然后杀死占用该端口的进程及时释放端口。或者修改httpd的配置文件,将端口修改为未被占用的端口。 2. 配置文件错误 有时httpd服务的配置文件中可能出现错误,例如语法错误或路径错误等等。在启动httpd服务之前,可以使用`apachectl configtest`命令进行检查,如果输出“Syntax OK”,则表示配置文件没有错误。如果出现错误,则需要根据错误提示进行相应修改。 3. 依赖关系问题 如果httpd依赖的其他程序或库缺失,也会导致启动失败。可以通过使用`systemctl status httpd.service`命令来查看httpd服务状态,如果输出“Failed to start”或“Loaded: failed”,则需要检查依赖关系是否完整。 4. SELinux问题 当SELinux启用时,有时会导致httpd服务启动失败。在这种情况下,可以在SELinux上禁用httpd服务,或者修改httpd配置文件解决SELinux相关的问题。 5. 用户权限问题 httpd服务启动可能需要特定的用户权限。如果使用的用户权限不够,则无法启动。可以尝试使用root用户启动httpd服务,或者根据需要修改相应的用户权限。 ### 回答3: CentOS 7中的Apache HTTP服务器(httpd)是一个常见的Web服务器,如果遇到httpd服务启动失败的情况,可能会影响服务器正常的工作和对外服务的稳定性。本文将提供一些可能会导致httpd服务启动失败的原因,并给出相应的解决方法。 1. 端口被占用 如果端口被其他进程占用,httpd服务就无法启动。可以通过 netstat -tulpn 命令查看端口占用情况,并杀死占用该端口的进程。如果端口被 httpd 服务自身占用,可以通过 systemctl restart httpd 命令重启 httpd 服务;如果是其他进程占用了端口,可以通过 kill 命令杀死该进程或更改 httpd.conf 文件配置,将 httpd 服务的端口改为其他空闲端口,重新启动。 2. 配置文件错误 httpd 服务的配置文件通常是 /etc/httpd/conf/httpd.conf,如果其中存在语法错误、权限问题或者其它配置错误,可能会导致 httpd 服务启动出错。可以通过将 httpd.conf 文件备份后删掉,重新执行 yum install httpd 命令安装 httpd 服务,然后手动修改 httpd.conf 文件,逐个检查每个配置项是否正确,确认无误后重启 httpd 服务。 3. SELinux 问题 SELinux 是 CentOS 7中提供的一种安全模块,它可以对系统文件和应用程序进行安全管控。如果 SELinux 配置不正确,可能会阻止 httpd 服务正常启动。可以通过修改 /etc/selinux/config 文件中 SELINUX=disabled 来暂时关闭 SELinux,然后重新启动 httpd 服务;或者一个更优的方式是,根据日志确定问题原因,使用命令 semanage 或者 setsebool 等工具将相关目录或者配置加入到 SELinux 许可列表中,重新启动 httpd 服务,以恢复服务正常工作。 4. 防火墙问题 如果你的 CentOs 7 服务器启用了防火墙,有可能会导致 httpd 服务启动失败。可以通过检查防火墙相关配置来确定问题原因,解决方案是修改防火墙规则,将端口 80 或者 443 等 httpd 服务需要的端口放行,重新启动 httpd 服务。 总之,当遇到 httpd 服务启动失败时,不要慌张,可以先通过日志或者执行命令查看错误信息,找到错误原因,然后根据错误原因一步一步解决问题。在解决问题过程中注意备份原始配置文件,以免造成不必要的损失。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

玉古云投

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值