MySql之建表思想

1.數據庫主表、從表、主鍵、外鍵

(1)主鍵:一般情況下,滿足第一範式的表都有一個主鍵Primary key,用於唯一標識的數據庫表中的一個字段。
外鍵:外鍵是相對於數據庫設計中的參考完整性而言,它與主鍵之間是彼此依賴的關係。假設現在有兩個表,產品分類表ProductCategory(主鍵c_id)和產品表Product(主鍵p_id),每類產品都屬於一個分類。那麼如果產品信息表肯定需要參考產品分類表進行定義。因爲如果沒有產品分類表,又何談產品分類呢。所以產品信息表Product(從表)需要引用ProductCategory(主表)中的主鍵CategoryId 進行產品分類定義,Product表中引用c_id的字段就是外鍵。
(從表的外鍵與主表的主鍵相對應以此用來和主表相關聯或者說主表的主鍵作爲從表的外鍵以此來和從表相關聯)
主表:被作爲外鍵引用的表。
從表:有外鍵引用的表。
外鍵可以爲空值(除了SQLServer等一些數據庫),但如果有值的話一定是你參照的那個主表中的主鍵值。換句話說,從表需要用到主表的屬性,沒有主表就沒有從表。
當刪除數據時
delete cascade (級聯刪除):如果主表中的一個主鍵被刪除了,那麼引用該主鍵的從表中的所有記錄也被刪除。
restrict (刪除限制):如果主表中的一個主鍵被刪除時,當從表中仍有外鍵引用這個主鍵時,那麼不允許直接刪除主表的這條記錄,必須先刪除或修改引用該主鍵的外鍵才能刪除。
no action(無參照完整性關係):無參照完整性關係,有了也不生效。
update更新同理。
從表和主表通過主外鍵相關聯。主表的稱爲主鍵,從表的稱爲外鍵。主外鍵主要用於參照完整性。










2.複合主鍵和聯合主鍵

(1)
首先說一下聯合主鍵,聯合主鍵其實就是中間表。在多對多模型裏,需要兩個表中的主鍵組成聯合主鍵,這樣就可以查到兩個表中的每個數據,如下例所述:

CREATE TABLE TEAM( 
Id MEDIUMINT AUTO_INCREMENT COMMENT '主鍵',
Dev VARCHAR (30) COMMENT '碼農', 
Pm VARCHAR(30) COMMENT '項目經理', 
Hr VARCHAR(30) COMMENT '人力' , 
PRIMARY KEY (Id) 
)
ENGINE = INNODB, 
CHARSET = UTF8 ;
CREATE TABLE information (
Id MEDIUMINT AUTO_INCREMENT COMMENT '主鍵',
Name VARCHAR(30) COMMENT '姓名',
Age int(10) COMMENT '年齡',
PRIMARY KEY(Id)
)
ENGINE=INNODB,
CHARSET = UTF8;

爲了查詢兩個表之間的元素,我們創建一箇中間表 TEAM_info
聯合主鍵就是第三張表

CREATE TABLE IF NOT EXISTS TEAM_info(
Id MEDIUMINT AUTO_INCREMENT COMMENT '主鍵Id',
TEAM_Id MEDIUMINT COMMENT '團隊Id',
info_Id MEDIUMINT COMMENT '信息Id',PRIMARY KEY(Id) 
)
ENGINE=INNODB,
CHARSET=UTF8;

然後就可以通過中間表進行連表查詢操作。

(2)
接下來是複合主鍵,一張表只能有一個主鍵,但根據需要,我們可以設置多個字段同時爲主鍵,這就叫做複合主鍵。(PS:我看好多人翻譯成聯合主鍵,我個人感覺不太準確,容易混淆)比如我們創建一張表使用多個字段來作爲主鍵

CREATE TABLE IF NOT EXIST student(
Name VARCHAR (30 ) COMMENT '姓名',
Age INT(30)  COMMENT '年齡',
PRIMARY KEY(Name,Age) 
);

這裏的Name和Age字段就是複合主鍵,主要是爲了防止Name重複,因此設置Age和Name爲複合主鍵,主鍵的字段長度和字段數目要越少越好。然後這裏有個注意點,如果要在INNODB引擎下設置主鍵自增長,自增長的列必須是第一列,然後只需要指定非自增長的列就可以了,否則會出現自增長重複。一旦出現自增長重複的話,我們可以創建一個主鍵索引,或者唯一索引。如果表結構已存在,想要添加複合主鍵,則應該使用如下方式。

ALTER TABLE tb_name ADD PRIMARY KEY (
PRIMARY_KEY_NAME_1,
PRIMARY_KEY_NAME_2
);

需要注意的是,這裏需要原來的表結構裏沒有主鍵,如果有的話,需要先ALTER DROP掉原有的主鍵,再添加複合主鍵進去。

3.創建表格

(1)複雜類型的對象有幾種表現形態

一對一
一對多或多對一
多對多

(2)一對多或多對一的對象存到數據庫表的設計方案
以部門和員工的關係來說明一對多或多對一的對象是怎麼存儲到數據庫表中的。
數據庫表的設計的原則:先不要去管這些對象的關係,看某個對象有什麼基本屬性,然後設計一個表來保存此對象的基本數據。在數據庫裏面怎麼去保證數據往數據庫裏面存的時候,關係不丟呢?這裏面有一個原則,記住一句話——在多的一方加外鍵描述數據之間的關係。
數據庫表的設計方案如下:
在這裏插入圖片描述
數據庫表的SQL語句如下:
department表





create table department
(
    id int primary key,
    name varchar(40)
);

d_employee表

create table d_employee
(
    id int primary key,
    name varchar(40),
    salary decimal(8,2),
    department_id int,
    constraint department_id_FK foreign key(department_id) references department(id)
);

主表的主鍵來作爲從表的外鍵

(3)多對多對象的表的設計
以老師和學生的關係來說明多對多的對象是怎麼存儲到數據庫表中的。
數據庫表的設計的原則:先不要去管這些對象的關係,看某個對象有什麼基本屬性,然後設計一個表來保存此對象的基本數據。在數據庫裏面怎麼去保證數據往數據庫裏面存的時候,關係不丟呢?需要加一箇中間表來描述數據的關係。
數據庫表的設計方案如下:
在這裏插入圖片描述
數據庫表的SQL語句如下:
teacher表





create table teacher
(
    id int primary key,
    name varchar(40),
    salary decimal(8,2)
);

student表

create table student
(
    id int primary key,
    name varchar(40)
);

teacher_student表(中間表)

create table teacher_student
(
    teacher_id int,
    student_id int,
    primary key(teacher_id,student_id),
    constraint teacher_id_FK foreign key(teacher_id) references teacher(id),
    constraint student_id_FK foreign key(student_id) references student(id)
);

注意:關於中間表的設計,在設計主鍵時,應將teacher_id,student_id這2列作爲聯合主鍵,即這2列值加在一起不能重複。(使用第三張表,主鍵相互對應)

(4)一對一的對象的數據庫設計
以身份證管理系統來說明一對一的對象是怎麼存儲到數據庫表中的。
數據庫表的設計的原則:先不要去管這些對象的關係,看某個對象有什麼基本屬性,然後設計一個表來保存此對象的基本數據。一對一的對象有一個主從關係,主可以沒有從,但從不能沒有主。在身份證管理系統中,一對一的關係表現爲一個人只能有一張身份證,一張身份證只能屬於一個人;主是人,從是身份證,一對一的對象有一個主從關係表現爲人可以沒有身份證,但身份證不能不屬於人。
數據庫表的設計方案如下:
在這裏插入圖片描述
數據庫表的SQL語句如下:
person表





create table person
(
    id int primary key,
    name varchar(40)
);

idcard表

create table idcard
(
    id int primary key,
    city varchar(40),
    constraint id_FK foreign key(id) references person(id)
);

(通過兩張表主鍵想對應)

(5)自連接表的設計
以家族管理系統來說明自連接表的設計。
數據庫表的設計方案如下:
在這裏插入圖片描述
注意:自連接,外鍵列不能加非空約束。
數據庫表的SQL語句如下:
person表





create table person
(
    id int primary key,
    name varchar(40),
    parent_id int,
    constraint parent_id_FK foreign key(parent_id) references person(id)
);

面試題:一個無限極分類的數的數據庫表的設計(請設計一個無限極分類的表)。
解:以一個商品分類表來說明怎樣去設計一個無限極分類的表。這裏用圖來說明

在這裏插入圖片描述
總結
如果不使用數據庫的三大範式建表,而是設計一張表,把所有數據存到一張表裏,那麼會出現冗餘數據,但是查詢性能很好,不需要查多表。例如,在多對多對象的表的設計中,我們可以設計一張表,把所有數據存到一張表裏。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章