数据库设计之E-R图和关系表
一 概念
E-R圖:也稱實體-聯(lián)系圖(Entity Relationship Diagram),提供了表示實體類型、屬性和聯(lián)系的方法,用來描述現(xiàn)實世界的概念模型。
實體:用矩形框表示,矩形框內(nèi)寫明實體名稱
實體屬性:用橢圓圖框或圓角矩形表示
關(guān)系:用菱形框表示實體之間的關(guān)系,在菱形框內(nèi)寫明關(guān)系名,分別與有關(guān)實體連接起來,同時在實心線段旁標(biāo)上關(guān)系的類型(1:1,1:N或M:N)
關(guān)系表:將E-R圖轉(zhuǎn)換成關(guān)系表,并定義列類型,建立主鍵、外鍵等各種約束。
二 E-R圖
下邊我們以大家最為熟悉的一個應(yīng)用場景——學(xué)校系統(tǒng)(學(xué)生、課程、老師、學(xué)生證)為例,設(shè)計一個E-R圖,如下:
說明:
?三 關(guān)系表
完成了E-R圖設(shè)計后,下邊就可以設(shè)計關(guān)系表了,如下步驟:
通過以上步驟,可以將E-R圖中的實體關(guān)系模型轉(zhuǎn)換成具體的關(guān)系表。該圖一共生成了5個表:4個實體表和1個關(guān)系表。
課程表
| 表名:t_course | 表的作用:定義實體課程 | ||
| 列名 | 類型 | 索引、約束 | 作用及備注 | 
| id | INT | PK | 唯一標(biāo)識 | 
| title | TEXT | NOT NULL | 課程名 | 
| period | INT | Index | 學(xué)時 | 
| description | TEXT | 課程描述 | |
老師表
| 表名:t_teacher | 表的作用:定義實體老師 | ||
| 列名 | 類型 | 索引、約束 | 作用及備注 | 
| id | INT | PK | 唯一標(biāo)識 | 
| name | TEXT | NOT NULL | 姓名 | 
| gender | BOOL | Index | 性別 True:男 False:女 | 
| address | TEXT | 住址 | |
| course_id | INT | FK:t_course.id | 由于1:N關(guān)系添加的外鍵 | 
學(xué)生表
| 表名:t_student | 表的作用:定義實體學(xué)生 | ||
| 列名 | 類型 | 索引、約束 | 作用及備注 | 
| student_id | INT | PK | 唯一標(biāo)識 | 
| name | TEXT | NOT NULL | 姓名 | 
| age | INT | Index | 年齡 | 
| parent | TEXT | 家長 | |
學(xué)生證表
| 表名:t_card | 表的作用:定義實體學(xué)生證 | ||
| 列名 | 類型 | 索引、約束 | 作用及備注 | 
| student_id | INT | PK | 學(xué)號,唯一標(biāo)識 | 
| start_from | datetime | 注冊日期、入學(xué)日期 | |
| end_to | datetime | 學(xué)生證有效期截止日期 | |
學(xué)生課程關(guān)系表
| 表名:t_enroll | 表的作用:定義關(guān)系學(xué)生:課程 | ||
| 列名 | 類型 | 索引、約束 | 作用及備注 | 
| student_id | INT | PK,FK:t_student.student_id | 學(xué)生標(biāo)識 | 
| course_id | INT | PK,FK:t_course.id | 課程標(biāo)識 | 
說明:
Index:索引,是對數(shù)據(jù)庫表中一列或多列的值進(jìn)行排序的一種結(jié)構(gòu)。對常用的查詢條件字段添加索引可以顯著提高SQL語句的性能。
Constraint:約束,是對列數(shù)據(jù)取值的某種限定。常見的約束有主鍵、外鍵、非空、唯一等。
PK:主鍵(Primary Key),唯一標(biāo)識一條記錄,不允許為空。在大多數(shù)數(shù)據(jù)庫中主鍵列也是一個索引列。
FK:外鍵(Foreign Key),是另一個表的主鍵,表示關(guān)聯(lián)關(guān)系,可以是空字段。
NOT NULL:非空約束,表示不允許列值為空。
四 SQL語句
關(guān)系表設(shè)計好之后,創(chuàng)建表格的SQL語句,也就水到渠成了,下邊是以上5個關(guān)系表對應(yīng)的建表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;學(xué)生表
//學(xué)生表 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;學(xué)生證表
//學(xué)生證表 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;學(xué)生課程關(guān)系表
//學(xué)生:課程關(guān)系表 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;五?參考文獻(xiàn)
《Python高效開發(fā)實戰(zhàn)》(劉長龍)
總結(jié)
以上是生活随笔為你收集整理的数据库设计之E-R图和关系表的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
 
                            
                        - 上一篇: Django+vue 分页展示
- 下一篇: 招聘岗位:大数据架构师 年薪:25-48
