主頁 > 後端開發 > MySQL用的在溜,不知道業務如何設計也白搭!!!

MySQL用的在溜,不知道業務如何設計也白搭!!!

2023-04-28 13:23:57 後端開發

MySQL業務設計

img

  • 作者: 博學谷狂野架構師
  • GitHub:GitHub地址 (有我精心準備的130本電子書PDF)

只分享干貨、不吹水,讓我們一起加油!??

邏輯設計

范式設計

范式概述

第一范式:當關系模式R的所有屬性都不能在分解為更基本的資料單位時,稱R是滿足第一范式的,簡記為1NF,滿足第一范式是關系模式規范化的最低要求,否則,將有很多基本操作在這樣的關系模式中實作不了,

第二范式:如果關系模式R滿足第一范式,并且R得所有非主屬性都完全依賴于R的每一個候選關鍵屬性,稱R滿足第二范式,簡記為2NF,

第三范式:設R是一個滿足第一范式條件的關系模式,X是R的任意屬性集,如果X非傳遞依賴于R的任意一個候選關鍵字,稱R滿足第三范式,簡記為3NF,

第一范式
  • 資料庫表中的所有欄位都只具有單一屬性
  • 單一屬性的列是由基本資料型別所構成的,
  • 設計出來的表都是簡單的二維表
示例

img

解決辦法

name-age列具有兩個屬性,一個name,一個 age不符合第一范式,把它拆分成兩列,

img

第二范式

要求表中只具有一個業務主鍵,也就是說符合第二范式的表不能存在非主鍵列只對部分主鍵的依賴關系

示例

有兩張表:訂單表,產品表

imgimg

解決辦法

一個訂單有多個產品,所以訂單的主鍵為【訂單ID】和【產品ID】組成的聯合主鍵,這樣2個主鍵不符合第二范式,而且產品ID和訂單ID沒有強關聯,故,把訂單表進行拆分為訂單表與訂單與商品的中間表,

img

第三范式

指每一個非主屬性既不部分依賴于也不傳遞依賴于業務主鍵,也就是在第二范式的基礎上消除了非主鍵對主鍵的傳遞依賴,

示例

img

解決辦法

其中

客戶編號 和訂單編號管理 關聯

客戶姓名 和訂單編號管理 關聯

客戶編號 和 客戶姓名 關聯

如果客戶編號發生改變,用戶姓名也會改變,這樣不符合第三大范式,應該把客戶姓名這一列洗掉

范式設計實戰

按要求設計一個電子商務網站的資料庫結構,本網站只銷售圖書類產品,需要具備以下功能:

  • 用戶登陸 商品展示 供應商管理
  • 用戶管理 商品管理 訂單銷售
用戶登陸及用戶管理
  • 用戶必須注冊并登陸系統才能進行網上交易,用戶名用來作為用戶資訊的業務主鍵
  • 同一時間一個用戶只能在一個地方登陸

img

只有一個業務主鍵,一定是符合第二范式,沒有屬性和業務主鍵存在傳遞依賴的關系,符合第三范式,

商品資訊

img

一個商品可以屬于多個分類,故,商品名稱和分類應該是組合主鍵,會有大量冗余,不符合第二范式,應該把分類資訊單獨存放

解決辦法

另外再建立一個中間表把分類資訊和商品資訊進行關聯

imgimg

最后的三張表如下

img

供應商管理功能

img

符合三大范式,不需要修改,但假如增加新的一列【銀行支行】,這樣隨著銀行賬戶的變化,銀行支行也會編號,不符合第三大范式

img

在線銷售功能

img

有多個業務主鍵,不符合第二范式,訂單商品單價、訂單數量、訂單金額存在傳遞依賴關系,不符合第三范式,需要拆解

解決辦法

創建一個訂單關聯表,將商品分類和商品名稱拆解出來

img

這時候,【訂單商品分類】與【訂單商品名】有依賴關聯,故合并如下

img

表匯總

img

查詢練習

撰寫SQL查詢出每一個用戶的訂單總金額(用戶名,訂單總金額)

COPYSELECT a.單用戶名, sum(d.商品價格 * b.商品數量)
FROM 訂單表 a
JOIN 訂單分類關聯表 b ON a.訂單編號 = b.訂單編號
JOIN 商品分類關聯表 c ON c.商品分類ID = b.商品分類ID
JOIN 商品資訊表 d ON d.商品名稱 = c.商品名稱
GROUP BY a.下單用戶名

撰寫SQL查詢出下單用戶和訂單詳情(訂單編號,用戶名,手機號,商品名稱,商品數量,商品價格)

COPYSELECT a.訂單編號, e.用戶名, e.手機號, d.商品名稱, c.商品數量, d.商品價格
FROM 訂單表 a
JOIN 訂單分類關聯表 b ON a.訂單編號 = b.訂單編號
JOIN 商品分類關聯表 c ON c.商品分類ID = b.商品分類ID
JOIN 商品資訊表 d ON d.商品名稱 = c.商品名稱
JOIN 用戶資訊表 e ON e.用戶名 = a.下單用戶
存在的問題
  • 大量的表關聯非常影響查詢的性能
  • 完全符合范式化的設計有時并不能得到良好得SQL查詢性能

反范式設計

什么叫反范式化設計
  • 反范式化是針對范式化而言得,在前面介紹了資料庫設計得范式
  • 所謂得反范式化就是為了性能和讀取效率得考慮而適當得對資料庫設計范式得要求進行違反
  • 允許存在少量得冗余,換句話來說反范式化就是使用空間來換取時間
商品資訊反范式設計

下面是范式設計的商品資訊表

商品資訊和分類資訊經常一起查詢,所以把分類資訊也放到商品表里面,冗余存放,

img

在線銷售功能反范式

下面是在線銷售功能的范式設計

img

首先來看訂單表
  • 查詢訂單資訊要關聯查詢到用戶表,但用戶表的電話是可能改變的,而且查詢訂單的時候經常查詢到用戶的電話
  • 查詢訂單經常會查詢到訂單金額,所以把訂單金額也冗余進來

新設計的訂單表如下

img

再來看訂單關聯表
  • 和商品資訊反范式設計一樣,查詢訂單的時候經常查詢商品分類,所以把商品分類和訂單名冗余進來
  • 商品的單價可能會編號,如果關聯查詢查詢只能查詢到最新的商品價格,而查詢不到下訂單時候的價格,并且商品單價經常會查詢, 所以把訂單單價也冗余進來

新設計的商品關聯表如下

img

查詢練習

撰寫SQL查詢出每一個用戶的訂單總金額

COPYSELECT 下單用戶名, sum(訂單金額)
FROM 訂單表
GROUP BY 下單用戶名;

撰寫SQL查詢出下單用戶和訂單詳情

COPY
SELECT  a.單用戶名, sum(d.商品價格 * b.商品數量)
FROM   訂單表 a
JOIN 訂單分類關聯表 b ON a.訂單編號 = b.訂單編號
JOIN 商品分類關聯表 c ON c.商品分類ID = b.商品分類ID
JOIN 商品資訊表 d ON d.商品名稱 = c.商品名稱
GROUP BY  a.下單用戶名;

總結

不能完全按照范式得要求進行設計,考慮以后如何使用表

范式化設計優缺點
優點
  • 可以盡量得減少資料冗余
  • 范式化的更新操作比反范式化更快
  • 范式化的表通常比反范式化的表更小
缺點
  • 對于查詢需要對多個表進行關聯
  • 更難進行索引優化
反范式化設計優缺點
優點
  • 可以減少表的關聯
  • 可以更好的進行索引優化
缺點
  • 存在資料冗余及資料維護例外
  • 對資料的修改需要更多的成本

物理設計

命名規范

資料庫、表、欄位的命名要遵守可讀性原則

使用大小寫來格式化的庫物件名字以獲得良好的可讀性

例如:使用custAddress而不是custaddress來提高可讀性,

資料庫、表、欄位的命名要遵守表意性原則

物件的名字應該能夠描述它所表示的物件

例如:對于表,表的名稱應該能夠體現表中存盤的資料內容;對于存盤程序存盤程序應該能夠體現存盤程序的功能,

資料庫、表、欄位的命名要遵守長名原則

盡可能少使用或者不使用縮寫

存盤引擎選擇

img

資料型別選擇

當一個列可以選擇多種資料型別時

  • 優先考慮數字型別
  • 其次是日期、時間型別
  • 最后是字符型別
  • 對于相同級別的資料型別,應該優先選擇占用空間小的資料型別
  • 對精度有要求的時候,選擇精度高的資料型別, int<float<double<decimal.
浮點型別

img

注意float 和double 是非精度型別,如果是和金額相關盡量用decimal

img

COPYselect  sum(c1), sum(c2), sum(c3)  from  test_numberic;

img

日期型別

面試經常問道 timestamp 型別 與 datetime區別

型別 大小 (位元組) 范圍 格式 用途
DATE 3 1000-01-01/9999-12-31 YYYY-MM-DD 日期值
TIME 3 ‘-838:59:59’/‘838:59:59’ HH:MM:SS 時間值或持續時間
YEAR 1 1901/2155 YYYY 年份值
DATETIME 8 1000-01-01 00:00:00/9999-12-31 23:59:59 YYYY-MM-DD HH:MM:SS 混合日期和時間值
TIMESTAMP 8 1970-01-01 00:00:00/2037 年某時 YYYYMMDD HHMMSS 混合日期和時間值,時間戳
  • datetime型別在5.6中欄位長度是5個位元組
  • datetime型別在5.5中欄位長度是8個位元組
  • timestamp 和時區有關,而datetime無關
COPYDROP TABLE IF EXISTS `test_time`;
CREATE TABLE `test_time`  (
  `c1` datetime(6) NULL DEFAULT NULL,
  `c2` timestamp(6) NULL DEFAULT NULL,
  `c3` time(6) NULL DEFAULT NULL
) ENGINE = InnoDB CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = Dynamic;
insert into  test_time  VALUES(NOW(),NOW(),NOW());
COPYmysql> select * from test_time;
+----------------------------+----------------------------+-----------------+
| c1                         | c2                         | c3              |
+----------------------------+----------------------------+-----------------+
| 2019-12-25 14:44:22.000000 | 2019-12-25 14:44:22.000000 | 14:44:22.000000 |
+----------------------------+----------------------------+-----------------+
1 row in set (0.00 sec)

set time_zone="-10:00"

mysql> select * from test_time;
+----------------------------+----------------------------+-----------------+
| c1                         | c2                         | c3              |
+----------------------------+----------------------------+-----------------+
| 2019-12-25 14:44:22.000000 | 2019-12-24 20:44:22.000000 | 14:44:22.000000 |
+----------------------------+----------------------------+-----------------+
1 row in set (0.00 sec)
字串型別
字串型別所需的存盤和值范圍
型別 說明 N的含義 是否有字符集 最大長度
CHAR(N) 定義字符 字符 255
VARCHAR(N) 變長字符 字符 16384
BINARY(N) 定長二進制位元組 位元組 255
VARBINARY(N) 變長二進制位元組 位元組 16384
TINYBLOB 二進制大物件 位元組 256
BLOB 二進制大物件 位元組 16K
MEDIUMBLOB 二進制大物件 位元組 16M
LONGBLOB 二進制大物件 位元組 4G
TINYTEXT 大物件 位元組 256
TEXT 大物件 位元組 16K
MEDUIMBLOB 大物件 位元組 16M
LONGTEXT 大物件 位元組 4G
定義與變長區別 (CHAR VS VARCHAR)
CHAR(4) 占用空間 VARHCAR(4) 占用空間
‘’ ‘ ‘ 4 bytes ‘’ 1 bytes
‘ab’ ‘ab ‘ 4 bytes ‘ab’ 3 bytes
‘abcd’ ‘abcd’ 4 bytes ‘abcd’ 5 bytes
‘abcdefgh’ ‘abcd’ 4 bytes ‘abcd’ 5 bytes
字串型別相關注意事項
  • 在BLOB和TEXT列上創建索引時,必須制定索引前綴的長度
  • VARCHAR和VARBINARY必須長度是可選的
  • BLOB和TEXT列不能有默認值
  • BLOB和TEXT列排序時只使用該列的前max_sort_length個位元組
COPYmysql> show variables like 'max_sort_length';
+-----------------+-------+
| Variable_name   | Value |
+-----------------+-------+
| max_sort_length | 1024  |
+-----------------+-------+
1 row in set, 1 warning (0.00 sec)

本文由傳智教育博學谷狂野架構師教研團隊發布,

如果本文對您有幫助,歡迎關注點贊;如果您有任何建議也可留言評論私信,您的支持是我堅持創作的動力,

轉載請注明出處!

轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/551421.html

標籤:Java

上一篇:Java的初始化塊

下一篇:返回列表

標籤雲
其他(158260) Python(38107) JavaScript(25396) Java(18005) C(15221) 區塊鏈(8260) C#(7972) AI(7469) 爪哇(7425) MySQL(7152) html(6777) 基礎類(6313) sql(6102) 熊猫(6058) PHP(5870) 数组(5741) R(5409) Linux(5334) 反应(5209) 腳本語言(PerlPython)(5129) 非技術區(4971) Android(4565) 数据框(4311) css(4259) 节点.js(4032) C語言(3288) json(3245) 列表(3129) 扑(3119) C++語言(3117) 安卓(2998) 打字稿(2995) VBA(2789) Java相關(2746) 疑難問題(2699) 细绳(2522) 單片機工控(2479) iOS(2432) ASP.NET(2402) MongoDB(2323) 麻木的(2285) 正则表达式(2254) 字典(2211) 循环(2198) 迅速(2185) 擅长(2169) 镖(2155) 功能(1967) .NET技术(1964) Web開發(1951) HtmlCss(1928) python-3.x(1918) 弹簧靴(1913) C++(1912) xml(1889) PostgreSQL(1874) .NETCore(1857) 谷歌表格(1846) Unity3D(1843) for循环(1842)

熱門瀏覽
  • 【C++】Microsoft C++、C 和匯編程式檔案

    ......

    uj5u.com 2020-09-10 00:57:23 more
  • 例外宣告

    相比于斷言適用于排除邏輯上不可能存在的狀態,例外通常是用于邏輯上可能發生的錯誤。 例外宣告 Item 1:當函式不可能拋出例外或不能接受拋出例外時,使用noexcept 理由 如果不打算拋出例外的話,程式就會認為無法處理這種錯誤,并且應當盡早終止,如此可以有效地阻止例外的傳播與擴散。 示例 //不可 ......

    uj5u.com 2020-09-10 00:57:27 more
  • Codeforces 1400E Clear the Multiset(貪心 + 分治)

    鏈接:https://codeforces.com/problemset/problem/1400/E 來源:Codeforces 思路:給你一個陣列,現在你可以進行兩種操作,操作1:將一段沒有 0 的區間進行減一的操作,操作2:將 i 位置上的元素歸零。最終問:將這個陣列的全部元素歸零后操作的最少 ......

    uj5u.com 2020-09-10 00:57:30 more
  • UVA11610 【Reverse Prime】

    本人看到此題沒有翻譯,就附帶了一個自己的翻譯版本 思考 這一題,它的第一個要求是找出所有 $7$ 位反向質數及其質因數的個數。 我們應該需要質數篩篩選1~$10^{7}$的所有數,這里就不慢慢介紹了。但是,重讀題,我們突然發現反向質數都是 $7$ 位,而將它反過來后的數字卻是 $6$ 位數,這就說明 ......

    uj5u.com 2020-09-10 00:57:36 more
  • 統計區間素數數量

    1 #pragma GCC optimize(2) 2 #include <bits/stdc++.h> 3 using namespace std; 4 bool isprime[1000000010]; 5 vector<int> prime; 6 inline int getlist(int ......

    uj5u.com 2020-09-10 00:57:47 more
  • C/C++編程筆記:C++中的 const 變數詳解,教你正確認識const用法

    1、C中的const 1、區域const變數存放在堆疊區中,會分配記憶體(也就是說可以通過地址間接修改變數的值)。測驗代碼如下: 運行結果: 2、全域const變數存放在只讀資料段(不能通過地址修改,會發生寫入錯誤), 默認為外部聯編,可以給其他源檔案使用(需要用extern關鍵字修飾) 運行結果: ......

    uj5u.com 2020-09-10 00:58:04 more
  • 【C++犯錯記錄】VS2019 MFC添加資源不懂如何修改資源宏ID

    1. 首先在資源視圖中,添加資源 2. 點擊新添加的資源,復制自動生成的ID 3. 在解決方案資源管理器中找到Resource.h檔案,編輯,使用整個專案搜索和替換的方式快速替換 宏宣告 4. Ctrl+Shift+F 全域搜索,點擊查找全部,然后逐個替換 5. 為什么使用搜索替換而不使用屬性視窗直 ......

    uj5u.com 2020-09-10 00:59:11 more
  • 【C++犯錯記錄】VS2019 MFC不懂的批量添加資源

    1. 打開資源頭檔案Resource.h,在其中預先定義好宏 ID(不清楚其實ID值應該設定多少,可以先新建一個相同的資源項,再在這個資源的ID值的基礎上遞增即可) 2. 在資源視圖中選中專案資源,按F7編輯資源檔案,按 ID 型別 相對路徑的形式添加 資源。(別忘了先把檔案拷貝到專案中的res檔案 ......

    uj5u.com 2020-09-10 01:00:19 more
  • C/C++編程筆記:關于C++的參考型別,專供新手入門使用

    今天要講的是C++中我最喜歡的一個用法——參考,也叫別名。 參考就是給一個變數名取一個變數名,方便我們間接地使用這個變數。我們可以給一個變數創建N個參考,這N + 1個變數共享了同一塊記憶體區域。(參考型別的變數會占用記憶體空間,占用的記憶體空間的大小和指標型別的大小是相同的。雖然參考是一個物件的別名,但 ......

    uj5u.com 2020-09-10 01:00:22 more
  • 【C/C++編程筆記】從頭開始學習C ++:初學者完整指南

    眾所周知,C ++的學習曲線陡峭,但是花時間學習這種語言將為您的職業帶來奇跡,并使您與其他開發人員區分開。您會更輕松地學習新語言,形成真正的解決問題的技能,并在編程的基礎上打下堅實的基礎。 C ++將幫助您養成良好的編程習慣(即清晰一致的編碼風格,在撰寫代碼時注釋代碼,并限制類內部的可見性),并且由 ......

    uj5u.com 2020-09-10 01:00:41 more
最新发布
  • MySQL用的在溜,不知道業務如何設計也白搭!!!

    MySQL業務設計 作者: 博學谷狂野架構師 GitHub:GitHub地址 (有我精心準備的130本電子書PDF) 只分享干貨、不吹水,讓我們一起加油!😄 邏輯設計 范式設計 范式概述 **第一范式:**當關系模式R的所有屬性都不能在分解為更基本的資料單位時,稱R是滿足第一范式的,簡記為1NF。 ......

    uj5u.com 2023-04-28 13:23:57 more
  • Java的初始化塊

    三種初始化資料域的方法: 在構造器中設定值 在宣告中賦值 初始化塊(initialization block) 初始化塊 在一個類的宣告中,可以包含多個代碼塊。只要構造類的物件,這些塊就會被執行。 class Employee { private static int nextId; private ......

    uj5u.com 2023-04-28 13:07:27 more
  • go slice使用

    1. 簡介 在go中,slice是一種動態陣列型別,其底層實作中使用了陣列。slice有以下特點: *slice本身并不是陣列,它只是一個參考型別,包含了一個指向底層陣列的指標,以及長度和容量。 *slice的長度可以動態擴展或縮減,通過append和copy操作可以增加或洗掉slice中的元素。 ......

    uj5u.com 2023-04-28 13:06:49 more
  • 菜鳥記錄:c語言實作PAT甲級1005--Spell It Right

    非常簡單的一題了,但還是交了兩三次,原因:對陣列的理解不足;對數字和字符之間的轉換不夠敏感。這將在下文中細說。 Given a non-negative integer N, your task is to compute the sum of all the digits of N, and ou ......

    uj5u.com 2023-04-28 13:05:42 more
  • [USACO07DEC]Mud Puddles S

    [USACO07DEC]Mud Puddles S 題目描述 Farmer John is leaving his house promptly at 6 AM for his daily milking of Bessie. However, the previous evening saw a ......

    uj5u.com 2023-04-28 13:05:37 more
  • 行程

    行程、輕量級行程和執行緒 行程在教科書中通常定義:行程是程式執行時的一個實體,可以把它看作充分描述程式已經執行到何種程度的資料結構的匯集。 從內核的觀點,行程的目的就是擔當分配系統資源(CPU時間、記憶體等)的物體。 當一個行程被創建時,他幾乎于父行程相同。它接受父行程地址空間的一個(邏輯)拷貝,并從進 ......

    uj5u.com 2023-04-28 13:05:22 more
  • 如何將 Spire.Doc for C++ 集成到 C++ 程式中

    Spire.Doc for C++ 是一個專業的 Word 庫,供開發人員在任何型別的 C++ 應用程式中閱讀、創建、編輯、比較和轉換 Word 檔案。 本文演示了如何以兩種不同的方式將 Spire.Doc for C++ 集成到您的 C++ 應用程式中。 通過 NuGet 安裝 Spire.Doc ......

    uj5u.com 2023-04-28 07:59:10 more
  • 線上問題排查回答(轉載)

    面試官:「你是怎么定位線上問題的?」 這個面試題我在兩年社招的時候遇到過,前幾天面試也遇到了。我覺得我每一次都答得中規中矩,今天來梳理復盤下,下次又被問到的時候希望可以答得更好。 下一次我應該會按照這個思路去答: 1、如果線上出現了問題,我們更多的是希望由監控告警發現我們出了線上問題,而不是等到業務 ......

    uj5u.com 2023-04-28 07:57:59 more
  • 行程

    行程、輕量級行程和執行緒 行程在教科書中通常定義:行程是程式執行時的一個實體,可以把它看作充分描述程式已經執行到何種程度的資料結構的匯集。 從內核的觀點,行程的目的就是擔當分配系統資源(CPU時間、記憶體等)的物體。 當一個行程被創建時,他幾乎于父行程相同。它接受父行程地址空間的一個(邏輯)拷貝,并從進 ......

    uj5u.com 2023-04-28 07:54:32 more
  • WPF教程_編程入門自學教程_菜鳥教程-免費教程分享

    教程簡介 WPF(Windows Presentation Foundation)是微軟推出的基于Windows 的用戶界面框架,屬于.NET Framework的一部分。它提供了統一的編程模型、語言和框架,真正做到了分離界面設計人員與開發人員的作業;同時它提供了全新的多媒體互動用戶圖形界面。 WP ......

    uj5u.com 2023-04-27 10:22:35 more