資料庫設計-物理設計

来源:https://www.cnblogs.com/sundaoxing/archive/2019/04/23/10749527.html
-Advertisement-
Play Games

資料庫設計 物理設計: 選擇合適的資料庫管理系統。 考慮因素:成本,業務場景,開發語言,功能,操作系統等。 選擇合適的資料庫管理系統。 考慮因素:成本,業務場景,開發語言,功能,操作系統等。 Oracle 2.定義資料庫,表及欄位,要符合命名規範。 選擇存儲引擎:這裡以MySQL為例 選擇存儲引擎: ...


資料庫設計

物理設計:

  1. 物理設計要做什麼?
    • 選擇合適的資料庫管理系統。
    • 考慮因素:成本,業務場景,開發語言,功能,操作系統等。
資料庫類型 成本 開發語言 支持系統 業務場景

Oracle

商業型 php,java,python等 windows/liunx系統 企業級
SQLServer 商業型 .NET,C#等 只支持windows系統 企業級
MySQL 開源型 php,java,python等 windows/liunx系統 中小型
PgSQL 開源型 php,java,python等 windows/liunx系統 中小型

2.定義資料庫,表及欄位,要符合命名規範。

    • 選擇存儲引擎:這裡以MySQL為例
存儲引擎 索引 事務 鎖粒度 主要應用 忌用
MyISAM 支持 不支持 支持併發插入的表級鎖 select,insert高負載 讀寫並用
InnoDB 支持 支持 支持MVCC的行級鎖 事務處理
MEMORY 支持 不支持 表鎖 中間計算,靜態數據 大型數據集,持久性存儲
Archive 不支持 不支持 行級鎖 日誌記錄,聚合分析,只支持select,insert操作 隨機讀取,刪除
Ndb cluster 支持 支持 行級鎖 高可用集群 典型引用
    • 表及欄位命名規範
      1. 可讀性:命名可讀性強
        • 舉例:列名nickname和nick_name相比,後者更加清晰明瞭,看起來更加舒服一點。
      2. 表意性:見名知意
        • 舉例:列名col1和user_name相比,後者更加具有直觀性,可以讓我們一眼就知道當前列名所代表的意思和可能的數據類型
      3. 敏感性:不能與資料庫專有欄位命名衝突
        • 舉例:MySQL中 有user表,所以我們自己創建用戶表時,儘量不使用user命名,可以加一個首碼比如資料庫縮寫_user。

3.根據選擇的資料庫管理系統選擇合適的數據類型

    • 常用數據類型及占用空間
列類型 存儲空間
TINYINT 1個位元組
SMALLINT 2個位元組
MEDIUMINY 3個位元組
INT 4個位元組
BINGINT 8個位元組
DATE 3個位元組
DATETIME 8個位元組
TIMESTAMP 4個位元組
CHAR(M) M位元組,1<= M <=255
VARCHAR(M) L+1位元組,在此 L < = M 和  1 <=M <= 255
FLOAT 4位元組
DOUBLE 8位元組
DECIMAL 對DECIMAL(M,D) ,如果M>D,為M+2否則為D+2
    • 欄位類型的選擇的原則
  1. 當一個列可以選擇多種數據類型的時候,優先考慮數字類型,其次是日期類型和二進位類型,最後是字元類型。
  2. 對於相同的數據類型,應考慮占用空間較小的數據類型。
    • 欄位類型的選擇的原則依據
  1. 在對數據進行比較(查詢條件,JOIN條件及排序)操作時,同樣的數據,字元處理往往比數字處理效率要低,因為字元要參考數據字典進行比較,數字就不需要。
  2. 在資料庫中,數據處理以頁為單位,列的長度越小,一頁中存儲的數據就越多,載入相同的數據時的頁數就相對較小,速度會更快。
    • 如何具體選擇欄位類型?
  1. char和varchar該如何選擇?
    • char用於數據長度差不多是一致的,基本都在一個小區間內波動或者列中最大數據長度小於50位元組。
    • varchar用於數據長度變化較大,不能預知其具體長度的數據。
  2. decimal和float該如何選擇?
    • decimal用於存儲精確數據,精度最高,但是占用空間很大。
    • float占用空間比decimal小,適用於非精確數據,但會丟失數據精度。
  3. 時間類型如何存儲?
    • 使用int:int 是從 1970 年開始累加的,但是 int 支持的範圍是 1901-12-13 到 2038-01-19 03:14:07,如果需要更大的範圍需要設置為 bigInt。但是這個時間不包含毫秒,如果需要毫秒,還需要定義為浮點數。
    • 使用timestamp:記錄經常變化的更新 / 創建 / 發佈 / 日誌時間 / 購買時間 / 登錄時間 / 註冊時間等,並且是近來的時間,夠用,時區自動處理,比如說做海外購或者業務可能拓展到海外。
    • 使用datetime:記錄固定時間如伺服器執行計劃任務時間 / 健身鍛煉計劃時間等,在任何時區都是需要一個固定的時間要做某個事情。
    • 資料庫設計的其他註意事項
  1. 如何選擇主鍵?
    • 區分業務主鍵和資料庫主鍵:
      • 業務主鍵:用於標識業務數據,進行表與表之間的關聯。
      • 資料庫主鍵:為了優化數據存儲和查找。若沒有設置資料庫主鍵,則InnoDB引擎會自動生成6個位元組的隱含主鍵。
    • 考慮主鍵是否要自動順序增長:部分資料庫是按照主鍵的順序邏輯存儲的。
    • 主鍵的欄位類型所占用的空間要儘可能小:對於使用聚集索引方式存儲的表,每個索引都會附加上主鍵信息。
  2. 避免使用外鍵(避免使用資料庫來提供外鍵約束功能):限於互聯網項目
    • 在高併發業務中,使用外鍵約束會降低數據導入的效率,增加維護成本。
    • 建議使用邏輯外鍵,事實上在資料庫中並沒有設置外鍵約束,但在項目上都認為這是外鍵。由程式來維護外鍵約束,而不是資料庫伺服器本身來實現該功能。
    • 相關聯的列要建立索引,增加查找效率。
    • 該怎麼創建表就怎麼創建表,只是沒有了FOREIGN KEY (`user_id`) REFERENCES `user` (`id`)該條外鍵約束命令。

例如:使用資料庫創建外鍵約束:

CREATE TABLE `m_user` (
  `id` int(11) NOT NULL AUTO_INCREMENT COMMENT '主鍵',
  `user_name` varchar(50) NOT NULL DEFAULT '' COMMENT '用戶名',
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

CREATE TABLE `m_order` (
  `id` int(11) NOT NULL AUTO_INCREMENT COMMENT '主鍵',
  `total_price` decimal(10,2) NOT NULL DEFAULT '0.00',
  `user_id` int(11) NOT NULL DEFAULT '0',
  PRIMARY KEY (`id`),
  CONSTRAINT `for_indx_user_id` FOREIGN KEY (`user_id`) REFERENCES `user` (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

    不使用資料庫創建外鍵約束:

CREATE TABLE `m_user` (
  `id` int(11) NOT NULL AUTO_INCREMENT COMMENT '主鍵',
  `user_name` varchar(50) NOT NULL DEFAULT '' COMMENT '用戶名',
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

CREATE TABLE `m_order` (
  `id` int(11) NOT NULL AUTO_INCREMENT COMMENT '主鍵',
  `total_price` decimal(10,2) NOT NULL DEFAULT '0.00',
  `user_id` int(11) NOT NULL DEFAULT '0',
  PRIMARY KEY (`id`),
  KEY `idx_user_id` (`user_id`),
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

    3.避免使用觸發器

    • 觸發器是一個隱藏的存儲過程,因為它不需要參數,不需要顯示調用,往往在你不知情的情況下已經做了很多操作,無形中增加了系統的複雜性。
    • 涉及到複雜的邏輯的時候,觸發器的嵌套是避免不了的,如果再涉及幾個存儲過程,再加上事務等等,很容易出現死鎖現象。
    • 存儲過程的致命傷在於移植性,存儲過程不能跨庫移植,在後期系統升級維護時難度加大。

    4.謹慎使用預留欄位

    • 無法準確的知道預留欄位的類型。
    • 無法知道預留欄位中所存儲的內容。
    • 後期維護預留欄位的成本高。

      建議:

    1. “按需設計”,在經過詳細有效的分析之後,在數據表中只放置必要的欄位,而不要留出大量的備用欄位。
    2. 如果數量很少,而且信息的性質與原表密切相關,那麼就可以直接在原表上動態增加欄位,並將相關的數據更新進去
    3. 如果數量較大,或者並非是原表對象至關重要的屬性,那麼就可以新增一個表,然後通過鍵值連接起來。

4.反範式化設計。

    • 什麼是反範式化?
      • 適當的違反的範式的要求,允許少量的數據冗餘,用空間換取時間。
    • 優點:增加查詢效率。

  以上僅為本人學習過程中的知識總結,若有錯誤,還請諸位不吝賜教。


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • Linux系統的目錄結構(必須掌握的內容) 所有目錄只有一個頂點/(根),所有目錄的起點。 只有一棵樹 Linux的目錄結構也是有規律的,而且也是按照類別組織的。 應用程式 /usr/bin 數據文件,幫助/usr/share 配置文件/etc/ 啟動命令 /etc/init.d/ 結論: 通俗的理 ...
  • 非常非常非常簡要的描述而已。 壓縮 壓縮的簡要原理是通過一些演算法,拿CPU的計算時間去換磁碟上存儲的空間。同時還可節省網路傳輸中的帶寬。 對於文本文件的壓縮效果比較好,對二進位程式、圖片等文件的壓縮效果就很差。 compress, uncompress 文件名:*.Z 古老的壓縮工具,目前已經不使用 ...
  • 什麼是雲計算? 雲計算是一種採用按量付費的模式,基於虛擬化技術,將相應計算資源(如網路、存儲等)池化後,提供便捷的、高可用的、高擴展性的、按需的服務(如計算、存儲、應用程式和其他 IT 資源)。 雲計算的基本特征? 自主服務:可按需的獲取雲端的相應資源(主要指公有雲); 網路訪問:可隨時隨地使用任何 ...
  • 參考:http://blog.csdn.net/pengxuan/article/details/51742296 ...
  • 21.SQL運行Log的讀取 .EXEC xp_readerrorlog 0,1,null,null,'開始時間','結束時間' 22. Alwayson 狀況及傳輸情況監控 23. (1)列出高級配置選項 Step 1, 先將 show advanced option 設為 1 Step 2, 運 ...
  • 最近學了 Redis,在 Linux 上安裝的,接下來就簡單講解一下修改 Redis 配置文件 修改密碼: 新安裝的 Redis 是預設沒有密碼的,可以給Redis設置一個密碼 先進入 Redis 的配置文件, 按 “/” 輸入 “requirepass” 搜索, 按 “n” 跳到下一個,按 “N” ...
  • 一、查看是否安裝mysql 什麼都沒顯示,說明沒有安裝 二、進入到opt目錄下,使用wget下載官方yum源的rpm包 三、安裝啟動mysql yum安裝: 然後會提示輸入y,輸入即可,安裝完成如下 啟動mysql服務: 查看mysql狀態: 關閉mysql服務: 開機啟動: 重啟systemctl ...
  • 摘要: 下文講述將"sql數值型"類型數值轉換為指定小數位的數據 方法1:採用 cast 方式轉換數值類型至指定小數位: 方法2:採用 convert 方式轉換數值類型至指定小數位: 參閱:http://www.maomao365.com/?p=6220 ...
一周排行
    -Advertisement-
    Play Games
  • 示例項目結構 在 Visual Studio 中創建一個 WinForms 應用程式後,項目結構如下所示: MyWinFormsApp/ │ ├───Properties/ │ └───Settings.settings │ ├───bin/ │ ├───Debug/ │ └───Release/ ...
  • [STAThread] 特性用於需要與 COM 組件交互的應用程式,尤其是依賴單線程模型(如 Windows Forms 應用程式)的組件。在 STA 模式下,線程擁有自己的消息迴圈,這對於處理用戶界面和某些 COM 組件是必要的。 [STAThread] static void Main(stri ...
  • 在WinForm中使用全局異常捕獲處理 在WinForm應用程式中,全局異常捕獲是確保程式穩定性的關鍵。通過在Program類的Main方法中設置全局異常處理,可以有效地捕獲並處理未預見的異常,從而避免程式崩潰。 註冊全局異常事件 [STAThread] static void Main() { / ...
  • 前言 給大家推薦一款開源的 Winform 控制項庫,可以幫助我們開發更加美觀、漂亮的 WinForm 界面。 項目介紹 SunnyUI.NET 是一個基於 .NET Framework 4.0+、.NET 6、.NET 7 和 .NET 8 的 WinForm 開源控制項庫,同時也提供了工具類庫、擴展 ...
  • 說明 該文章是屬於OverallAuth2.0系列文章,每周更新一篇該系列文章(從0到1完成系統開發)。 該系統文章,我會儘量說的非常詳細,做到不管新手、老手都能看懂。 說明:OverallAuth2.0 是一個簡單、易懂、功能強大的許可權+可視化流程管理系統。 有興趣的朋友,請關註我吧(*^▽^*) ...
  • 一、下載安裝 1.下載git 必須先下載並安裝git,再TortoiseGit下載安裝 git安裝參考教程:https://blog.csdn.net/mukes/article/details/115693833 2.TortoiseGit下載與安裝 TortoiseGit,Git客戶端,32/6 ...
  • 前言 在項目開發過程中,理解數據結構和演算法如同掌握蓋房子的秘訣。演算法不僅能幫助我們編寫高效、優質的代碼,還能解決項目中遇到的各種難題。 給大家推薦一個支持C#的開源免費、新手友好的數據結構與演算法入門教程:Hello演算法。 項目介紹 《Hello Algo》是一本開源免費、新手友好的數據結構與演算法入門 ...
  • 1.生成單個Proto.bat內容 @rem Copyright 2016, Google Inc. @rem All rights reserved. @rem @rem Redistribution and use in source and binary forms, with or with ...
  • 一:背景 1. 講故事 前段時間有位朋友找到我,說他的窗體程式在客戶這邊出現了卡死,讓我幫忙看下怎麼回事?dump也生成了,既然有dump了那就上 windbg 分析吧。 二:WinDbg 分析 1. 為什麼會卡死 窗體程式的卡死,入口門檻很低,後續往下分析就不一定了,不管怎麼說先用 !clrsta ...
  • 前言 人工智慧時代,人臉識別技術已成為安全驗證、身份識別和用戶交互的關鍵工具。 給大家推薦一款.NET 開源提供了強大的人臉識別 API,工具不僅易於集成,還具備高效處理能力。 本文將介紹一款如何利用這些API,為我們的項目添加智能識別的亮點。 項目介紹 GitHub 上擁有 1.2k 星標的 C# ...