1. 程式人生 > >Mysql系列——資料庫設計(4)——實體表之間的關係

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 4RPC-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意思是“每秒查詢率”,是一臺伺服器每秒能夠相應的查詢次數,是對一個特定的查詢伺服