Mysql系列——資料庫設計(4)——實體表之間的關係
幹軟體這一行這麼多年,發現好的程式設計師也更加的好學。
大學時代,舍友放過一個影片,對其中的六度理論印象很深刻。
*六度人脈關係理論(Six Degrees of Separation),是指地球上所有的人都可以通過六層以內的熟人鏈和
任何其他人聯絡起來。通俗地講:“你和任何一個陌生人之間所間隔的人不會超過六個,也就是說,最多通過六個人你就能夠認識任何一個陌生人。”*
我們很容易明白,六度理論的數學基礎是級數。m^n是一個很大的數字,幾乎能夠快速到達每一個人。
圖片來自網路
從中也可以看出,越是複雜的關係軟體系統的複雜度越高。這裡複雜度包括了資料庫關係、程式碼結構。因此前輩們才會整理出資料庫設計理論、設計模式理論等。而這其中 M:N(多對多)、1:M(一對多)、1:1(一對一)的複雜度是由高到低的。這裡說的多對多等就是今天要講的實體表之間的關係。
軟體開發在開始的時候,專案經理們喜歡用建築工程的理論來思考軟體系統。因此也衍生出瀑布開發模式,瀑布開發模式將系統開發分為可行性分析、概要設計、詳細設計等諸多階段,許多公司沒有嚴格參照這個流程設計開發系統,但是資料庫設計都會有一個設計稽核的過程。它屬於詳細設計的一個階段,這個時候系統的需求已經明晰(暫且不要提敏捷先生,他在另外一個房間喝茶,正在思索是否要邀請瀑布閣下過去呢)。
資料庫設計中一個重要的過程就是畫ER圖的過程,ER圖(Entity Relationship Diagram)即實體-聯絡圖,其中的E已經在前面說過,只要滿足第三正規化就可以了。而且中的R就是今天要探討的話題。
摘自網路
在上圖中,直角矩形代表實體,菱形代表關係。而圓角矩形代表的則是實體與關係的屬性。在實際設計過程中,一般先只畫直角矩形與菱形,在細化的過程中再畫上圓角矩形。也就是說先摸清枝幹,再抓葉子。
有一個規律性的小技巧,一般來說實體表示某一個相對固定的物件,比如講師、學生、課程,以及商品、訂單等。而關係則表示某一個活動或者隸屬關係,比如就職於、學習、教授等相對抽象的活動。
那麼怎樣判斷某對實體之間的關係屬於多對多、一對多、一對一呢?是這樣一個過程,想想一下:
A實體與B實體,在這個活動或者隸屬關係中,之間的位置關係數目。
如上圖中:
講師在教授活動中,一位講師教授幾門課程呢?答案是多門,因此這一方是1:M關係,那麼反過來一門課程由幾位講師教授呢?在此,答案是一位講師。因此是1:1的關係,那麼他們相互之間的關係就是1:M(一對多)。如果這裡,某些門課程難度很大,請了多位講師講解,這時第二個問題,答案就是多位講師,因此是1:N的關係,那麼這裡就會程式設計M:N(多對多的關係)。
同樣,學生學習課程的關係中。首先發問,一位學生學習幾門課程呢?答案是N門,因此是1:N關係。同時反過來一門課程被幾位同學學習呢?答案是多位同學。因此是1:M的關係,因此他們交叉後關係就是M:N(多對多)。如果這裡架設是古代的貴族私塾制度,一門課程只有一位學生,那麼上述第二個問題,答案就是一位同學學習,就變成了1:1關係,那麼交叉後就是1:N(一對多關係)了。
這裡,小結一下:
在某個活動中,A與B之間關係。假設A為主語地位,首先發問,在這個活動中A為主導時,一個A要操作幾個B呢?再發問如果B為主語地位,一個B被幾個A操作呢?
**上述答案畫一個表格:
A為主語問題答案 | B為主語問題答案 | A:B |
---|---|---|
1:1 | 1:N | N:1 |
1:1 | 1:1 | 1:1 |
1:M | 1:N | N:M |
那麼怎樣在資料表中用欄位表示這種關係呢?
如果是M:N關係,只能獨立一個關係表表示這種關係,並且這次活動中如果有額外屬性直接寫在關係中。
如圖中,學生學習課程這個活動中,用學習關係表來表示之間的M:N(多對多)關係,因為有成績這個額外屬性,因此在這裡放在學習這個關係表中:
這時候學習關係表的表結構如下:
欄位名稱 | 說明 |
---|---|
學生id | 學生表主鍵 |
課程id | 課程表主鍵 |
成績 | 考試成績 |
如果是1:M活動關係:
如果這種關係恆定,並且沒有額外的活動屬性的,那麼將1端的Id可以放在M端表示這種關係。比如,某一個小學,這位老師打算一直在這裡從教,教授這些孩子們做人的道理。改變他們的命運,那麼課程與教師這種關係很穩定,而且大多數軟體系統比人類的壽命要短暫。那麼這裡可以在課程這裡加上教師的id表示這種教授活動關係:
如果課程所屬的教師經常變動,如經常性的教師離職等造成這種教授活動不恆定。這種情況下還是獨立一個關係表更加靈活些:
最後,如果是1:1關係,那麼可以在任意一段放置對方的id表示這種關係。
這個時候,上述的id都被稱為外來鍵。
值得一提的是,這些外來鍵經常被作為索引的候選欄位,後續課程中講解索引的時候會探討這個專題。
感謝您的耐心閱讀,今天是週末,出去走走吧。畢竟多走路,不僅對健康、事業有利,也能找到更加靠譜的物件呀,您說呢?
相關推薦
Mysql系列——資料庫設計(4)——實體表之間的關係
幹軟體這一行這麼多年,發現好的程式設計師也更加的好學。 大學時代,舍友放過一個影片,對其中的六度理論印象很深刻。 *六度人脈關係理論(Six Degrees of Separation),是指地球上所有的人都可以通過六層以內的熟人鏈和 任何其他人聯
資料庫設計(4)_邏輯結構設計_常用技巧
總結一下這些年在專案中一些設計技巧,有些在前面的章節已經提到過。 一、屬性定義 1.1、資料型別 (1)整型還是字元型 在可以為整型的情況下儘量使用整型,通常情況下整型佔的空間小,可以提高I/O及快取命中率。 (2)定長還是變長字元型 定長的
Mysql資料庫學習(4)階段性完結
-- 倒序輸出全部使用者的許可權資訊 SELECT * from users order by powers desc -- 統計女生人數,靈活使用count,看題目要求,你要計算的是什麼? SELECT COUNT(sid) FROM `student` WHERE sse
從零寫分散式RPC框架 系列 1.0 (4)RPC-Client模組設計實現
RPC-Client模組負責建立 動態代理物件 供 服務消費者 使用,而動態代理物件的方法執行則是通過RPC呼叫RPC-Server的服務實現。即RPC-Client遮蔽了底層的通訊過程,使得服務消費者可以基於介面透明使用服務提供者的服務。 系列文章: 從零寫分散式RPC框架 系
充值系列—充值系統資料庫設計(一)
在我們的遊戲充值模組中,接入了支付寶,蘋果,Paypal, googleplay , mycard, mol, 360,機鋒,91等各種充值渠道。這篇文章(包括接下來的幾篇文章)將對充值系統的需求,資料庫設計,構架,充值流程,安全處理,各種渠道的詳細接入方式等各個方面做出詳細的說明。 充
MYSQL資料庫設計(一)
MYSQL資料庫設計 卷首 一個設計精良,結構合理,並且易於維護的資料庫可以大大削減在隨後工作中的一些效能問題,前期做的工作越多,後期做的工作就越少。 思考示例: 假如有一位老師開設了一門課程,對於選擇這門課程的同學需要建立一個數據庫來存放資料,這樣一個數據庫設計時,
MySQL資料庫操作(四)——多表之間的關係
主鍵與外來鍵 1、一張表可以有多個外來鍵 2、外來鍵是表的主鍵,可以是別的表,也可以是本身(少見) 3、外來鍵可以為null,可以重複,但是不能不存在,必須要查的到 建立語法 foreign key(
資料庫設計(三)—— 使用者許可權設計模式(上)
方法一:從職位(角色)的角度出發,指定職位擁有那些操作許可權。給定使用者一個職位,當用戶登入的時候通過Session儲存該職位所具有的操作許可權。當用戶執行操作時,邏輯層通過遍歷判斷使用者是否具有這個操
java資料庫程式設計(4) 使用execute方法執行SQL語句
Statement的execute()語句可以執行任何SQL語句,但是它比較麻煩,故通常應該使用executeQuery()或者executeUpdate()方法。 使用exrcute()方法執行只是返回boolean值,它表示執行該SQL語句是否返回了ResultSet物
資料庫設計(一)
資料庫設計(一)——資料庫設計 一、資料庫設計簡介 按照規範設計,將資料庫的設計過程分為六個階段: A、系統需求分析階段 B、概念結構設計階段 C、邏輯結構設計階段 D、物理結構設計階段 E、資料庫實施階段 F、資料庫執行與維護階段 需求分析和概念結構設計獨立於任何資料庫管理系統
ros中標誌位設計(4)
由於需要涉及控制權的交接事件,需要通過標誌位的方式進行設計。 首先需要自定一個標誌位的資訊在ros中用於標誌位資訊的釋出。 下面是用於標誌位的標頭檔案Flag.h // Generated by gencpp from file xx_msgs/Flag.msg // DO NOT ED
SQL資料庫設計(一)---需求分析與邏輯設計
今天先來介紹 資料庫設計中的需求分析和邏輯設計(ER圖)階段,明天介紹物理設計與維護優化,資料庫設計是非常有意思的:-) 資料庫設計 根據系統業務的需要,結合我們所選用的DBMS,
資料庫設計(1)轉載
轉自:https://www.pandashen.com/2018/08/14/20180814131241/ 前言 這是關於 MySQL 系列文章的第三篇,在前兩篇文章 《MySQL —— 資料庫基礎》 和 《MySQL —— SQL 語句總結》 中,主要介紹了一些資料庫的基礎概念、建立表
從零寫分散式RPC框架 系列 2.0 (4)使用BeanPostProcessor實現自定義@RpcReference註解注入
之前服務提供方 RpcServer 我們是使用 ApplicationContextAware 來掃描 @RpcService 註解,新增一個註解即可實現服務暴露。現在,我們用 BeanPostProcessor 來實現服務注入,自動將服務實現類注入到被@RpcReference註解標記
資料庫基礎(4)函式依賴公理和推論(Armstrong公理),屬性閉包和求候選鍵的技巧
函式依賴裡面,函式依賴公理,Armstrong公理以及屬性閉包的定義都有必要仔細學習 1.邏輯蘊含基本定義 2.Armstrong公理和推論–可以用來判斷一個函式依賴X -> Y 是否邏輯蘊含
基於dragonboard 410c的智慧魔鏡設計(4)——視訊訊息檢索及自動播放
前面給大家介紹瞭如何自動的檢索指定使用者的文字訊息,並且採用html模板方式在qt控制元件上自動迴圈的播放文字訊息,但是在智慧魔鏡中我們還可以向指定使用者推送視訊訊息,實時顯示視訊訊息,這裡進一步向大家介紹如何在基於dragonboard 410c的智慧魔鏡上實
【20171002】python_語言設計(4)檔案
1.檔案 (1)檔案定義:儲存在外部介質上的資料或資訊集合,有序資訊 (2)文字顯示:計算機顯示功能 (3)編碼:資訊轉化的過程 ASCII碼:7個二進位制位表示128個字元; Unicode編碼:跨語言跨平臺統一且唯一的二進位制編碼,每個字元兩個位元組長,65536個字元的編
Service與Android系統設計(4)-- ServiceManager
System Service的驅動形式 --- ServiceManager 對於ServiceManager的使用,我們在應用程式程式設計時也會經常使用到,比如我們需要使用Sensor時,我們一般會做如下的呼叫: mSensorManager = (SensorMan
Linux下Mysql的資料庫備份(基於 CentOS 7.4 64位)
在做專案的時候,經常會需要對資料庫進行備份,基於Linux系統下的操作我還是第一次做,所以在網上查詢了很多資料,分別參考了https://www.cnblogs.com/batsing/p/4938986.html 和 ht
MySQL效能管理及架構設計(一):什麼影響了資料庫查詢速度、什麼影響了MySQL效能
一、什麼影響了資料庫查詢速度 1.1 影響資料庫查詢速度的四個因素 1.2 風險分析 QPS: Queries Per Second意思是“每秒查詢率”,是一臺伺服器每秒能夠相應的查詢次數,是對一個特定的查詢伺服