数据库设计之E-R图和关系表
一 概念
E-R圖:也稱實體-聯系圖(Entity Relationship Diagram),提供了表示實體類型、屬性和聯系的方法,用來描述現實世界的概念模型。
實體:用矩形框表示,矩形框內寫明實體名稱
實體屬性:用橢圓圖框或圓角矩形表示
關系:用菱形框表示實體之間的關系,在菱形框內寫明關系名,分別與有關實體連接起來,同時在實心線段旁標上關系的類型(1:1,1:N或M:N)
關系表:將E-R圖轉換成關系表,并定義列類型,建立主鍵、外鍵等各種約束。
二 E-R圖
下邊我們以大家最為熟悉的一個應用場景——學校系統(學生、課程、老師、學生證)為例,設計一個E-R圖,如下:
說明:
?三 關系表
完成了E-R圖設計后,下邊就可以設計關系表了,如下步驟:
通過以上步驟,可以將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高效開發實戰》(劉長龍)
總結
以上是生活随笔為你收集整理的数据库设计之E-R图和关系表的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Django+vue 分页展示
- 下一篇: linux cmake编译源码,linu