數據庫是怎麼存儲數據的?及一對一、一對多、多對多表的設計

       最近在重新學數據庫,一方面因爲是做網站的時候發現查詢的sql語句非常難寫,另一方面正好今年開了分佈式數據庫的課程,權當複習了。哎,現在才感覺到本科教數據庫的申老師有多麼溜,好後悔那時候當個鐵鐵的混子吶!

       數據庫存儲數據說到底還是通過字段、記錄、表、約束來存儲數據的。






一、數據庫的一些基本術語

       字段:事物的一種特性,可以理解爲成員變量一枚。

       屬性:字段的別稱。

       列:字段的別稱。

       記錄:字段的組合,表示具體的一個事物,其實就是數據庫表中的一行。

       元組:記錄的別稱。

       表:記錄的組合,表示某一類事物的集合。





二、約束概念及分類

       約束其實就是對數據庫表中屬性進行操作的一些限制。

       約束大體可以分爲列約束和表約束,其實只是約束寫的位置不同而已,沒必須要糾結。列約束是直接寫在字段類型的後面,而表約束是加在表的最後,需要用括號將相應的字段括起來。



1、主鍵約束

       主鍵:某張表中爲了唯一標識某個事物(某條記錄)的一個字段或者多個字段的集合。

       開發中一般用沒有實際意義的字段作爲主鍵,一般是數字。



2、外鍵約束

       外鍵:某張表中來自其他表的主鍵或者唯一鍵的若干個字段。當然也可能是自己的主鍵或唯一鍵,如下圖:

Alt

       但是Mysql好像是不支持列級的外鍵約束的,只能用表級的外鍵約束來做限制。

	create table user
	(
		user_id int primary key,
		user_name varchar(20) unique,
		user_email varchar(40) not null,
		user_number int,
		foreign key(user_number) references user(user_id)
	)

       含有外鍵的表叫外鍵表,作爲外鍵字段來自的表叫做主鍵表。

       關聯表的刪除順序:必須先刪除外鍵表,再刪除主鍵表



3、唯一鍵約束

       在字段後面用unique即可,Mysql好像也不支持列級約束脩改約束名,實測支持表級約束情況下的修改約束名。

Alt


4、default約束

       保證一條記錄中的某個字段一定有值。

	create table department
	(
		dep_id int primary key,
		dep_name varchar(20) unique,
		dep_max_emp_count int default 500
	)

       就算有默認值,如果往表中插入數據的時候不寫出相應字段的話,則必須要顯示指明還有默認值的字段爲null,否則會報錯。



5、check約束

       保證事物屬性在合法範圍內。

	create table if not exists department
	(
		dep_id int primary key,
		dep_name varchar(20) unique,
		dep_max_emp_count int default 500,
		dep_max_count int,
		check(dep_max_count>10 and dep_max_count<30)
	)

       在MySQL 8.0.16版本之前的CHECK約束能被解析但是被忽略掉了,就是寫了也沒用。MySQL 8.0.16版本之後,支持CHECK約束。






二、一對一、一對多、多對多表設計

1、一對一情況

       以表A和表B是一對一舉例。

       一對一情況就比較簡單了,相當於表A的外鍵是表B的主鍵,表B的外鍵可以是表A的主鍵。


2、一對多情況

       以表A和表B是一對多關係舉例。

       外鍵只能存在於多的那一邊。舉個具體例子,父母和孩子是一對多的關係,如果你將外鍵放在父母表中,那麼你勢必要在父母表中添加一組孩子的主鍵作爲外鍵,然而一個父母對多個孩子,那存儲的時候就會很麻煩,會冗餘數據。


3、多對多情況

       以表A和表B是多對多關係舉例。

       其實這種情況僅靠一張表是做不到的,需要新建一張表來維護這種多對多的關係

       舉例:老師和班級就是多對多關係,一個老師可以給多個班級上課,一個班級有多個老師給他們上課。第三張表中包含老師表的主鍵和班級表的主鍵分別作爲新表的外鍵,也包含新增字段即老師上的課程名字。當然每個表都需要主鍵,主鍵可以看作是兩個外鍵和新增字段的組合

Alt

	create table if not exists classroom
	(
		room_id int primary key,
		room_stu_count int
	);
	
	create table if not exists teacher
	(
		tea_id int primary key,
		tea_name varchar(20)
	);
	
	create table class_tea_mapper
	(
		ct_mapper_c_id int,
		ct_mapper_t_id int,
		foreign key(ct_mapper_c_id) references classroom(room_id),
		foreign key(ct_mapper_t_id) references teacher(tea_id)
	)
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章