資料庫設計範式

来源:https://www.cnblogs.com/yinshoucheng-golden/archive/2018/01/01/8166618.html
-Advertisement-
Play Games

資料庫設計範式是一個很重要的概念,但是這個重要程度只是適合於參考。使用資料庫設計範式,可以讓數據表更好的進行數據的保存,因為在合理的設計,如果數據量一大也肯定會存在性能上的問題,所以在開發中,唯一可以稱為設計的寶典——設計的時候儘量避免日後的程式出現多表關聯查詢。 第一範式 所謂的第一範式指的是數據... ...


資料庫設計範式是一個很重要的概念,但是這個重要程度只是適合於參考。使用資料庫設計範式,可以讓數據表更好的進行數據的保存,因為在合理的設計,如果數據量一大也肯定會存在性能上的問題,所以在開發中,唯一可以稱為設計的寶典——設計的時候儘量避免日後的程式出現多表關聯查詢。

第一範式

所謂的第一範式指的是數據表中的數據列不可再分。例如,現有如下一張表:

  1. CREATE TABLE member(
  2.    mid NUMBER PRIMARY KEY,
  3.    name VARCHAR2(200) NOT NULL,
  4.    contact VARCHAR2(200)
  5. )

這個時候設計的就不合理,因為聯繫方式由多種數據所組成(電話、地址、email、手機、郵政編碼等),所以這種設計是不符合第一範式的,現在可以修改設計如下:

  1. CREATE TABLE member(
  2.    mid NUMBER PRIMARY KEY,
  3.    name VARCHAR2(200) NOT NULL,
  4.    address VARCHAR2(200),
  5.    zipcode VARCHAR2(6),
  6.    mobile VARCHAR2(20),
  7.    tel VARCHAR2(20)
  8. )

但是在這裡有兩點需要說明。

1、關於姓名,在國外的表設計姓名也分為姓和名兩類,但是在中國就是姓名保存。

2、關於生日,生日有專門的數據類型(DATE),所以不能將其設置為生日年、生日月、生日日;

所謂的不可分割指的是所有的數據類型都是使用資料庫提供好的各個數據類型。

第二範式(多對多)

第二範式定義數據表中的非關鍵欄位不存在對任意候選關鍵欄位的部分函數依賴。

第二範式分為兩種理解:

1、列之間不應該存在函數關係,現有如下一張表:

  1. CREATE TABLE orders(
  2.    oid NUMBER PRIMARY KEY,
  3.    amount NUMBER,
  4.    price NUMBER,
  5.    allprice NUMBER
  6. )

現在的商品總價(allprice)=商品單價(price)*商品數量(amount),所以存在了函數的依賴關係。

2、通過一個數據表的設計完成一個學生選課系統,如果說現在按照第一範式,則如下設計:

  1. CREATE TABLE studentcourse(
  2.    stuid NUMBER PRIMARY KEY,
  3.    stuname VARCHAR2(20) NOT NULL,
  4.    cname VARCHAR2(50) NOT NULL,
  5.    credit NUMBER NOT NULL,
  6.    score NUMBER
  7. )
  8.  
  9. INSERT INTO studentcourse (stuid,stuname,cname,credit,score)
  10.    VALUES (1,'張三','java',3,99);
  11. INSERT INTO studentcourse (stuid,stuname,cname,credit,score)
  12.    VALUES (2,'李四','java',3,89);
  13. INSERT INTO studentcourse (stuid,stuname,cname,credit,score)
  14.    VALUES (3,'王五','java',3,67);
  15. INSERT INTO studentcourse (stuid,stuname,cname,credit,score)
  16.    VALUES (1,'張三','C',1,79);
  17. INSERT INTO studentcourse (stuid,stuname,cname,credit,score)
  18.    VALUES (2,'李四','C',1,69);

這種設計符合第一範式,但是不符合第二範式,因為程式會存在如下的錯誤:

(1)數據重覆,學生和課程的數據都處於重覆的狀態,而且最為嚴重的是主鍵的設置問題。

(2)數據更新過多,如果現在一門課程已經有1000人參見的話,則更改一門課程學分的時候,需要修改1000條記錄,肯定性能上會有影響。

(3)如果一門課程沒有一個學生參加,這門課程就從學校徹底消失了。

如果想要解決此問題,則可以將數據表的設計修改如下:

  1. CREATE TABLE student(
  2.    stuid NUMBER PRIMARY KEY,
  3.    stname VARCHAR2(20) NOT NULL
  4. )
  5.  
  6. CREATE TABLE course(
  7.    cid NUMBER PRIMARY KEY,
  8.    cname VARCHAR2(50) NOT NULL,
  9.    credit NUMBER NOT NULL
  10. )
  11.  
  12. CREATE TABLE studentcourse(
  13.    stuid NUMBER REFERENCES student(stuid),
  14.    cid NUMBER REFERENCES course(cid),
  15.    score NUMBER
  16. )
  17.  
  18. INSERT INTO student (stuid,stname)
  19.    VALUES (1,'張三');
  20. INSERT INTO student (stuid,stname)
  21.    VALUES (2,'李四');
  22. INSERT INTO student (stuid,stname)
  23.    VALUES (3,'王五');
  24.  
  25. INSERT INTO course (cid,cname,credit)
  26.    VALUES (10,'java',3);
  27. INSERT INTO course (cid,cname,credit)
  28.    VALUES (11,'c',1);
  29. INSERT INTO course (cid,cname,credit)
  30.    VALUES (12,'oracle',2);
  31.  
  32. INSERT INTO (stuid,cid,score) VALUES (1,10,99);
  33. INSERT INTO (stuid,cid,score) VALUES (2,10,89);
  34. INSERT INTO (stuid,cid,score) VALUES (3,10,67);
  35. INSERT INTO (stuid,cid,score) VALUES (1,11,79);
  36. INSERT INTO (stuid,cid,score) VALUES (1,11,69);

第三範式(一對多)

例如,一個學校有多個學生,如果用第一範式無法實現,而如果用第二範式則表示多對多的關係,即,一個學校有多個學生,一個學生在多個學校,不符合實際情況。所以此時可以使用第三範式,設計編寫如下:

  1. CREATE TABLE school(
  2.    sid NUMBER PRIMARY KEY,
  3.    sname VARCHAR2(20) NOT NULL
  4. );
  5.  
  6. CREATE TABLE student(
  7.    stuid NUMBER PRIMARY KEY,
  8.    stuname VARCHAR2(20) NOT NULL,
  9.    sid NUMBER REFERENCES school(sid)
  10. );

而在實際的項目之中,第三範式的使用是最多的。

以上三個範式只是作為參考使用,實際項目中需要具體問題具體分析。

資料庫的設計工具PowerDesigner

對於資料庫設計工具有很多,但是其中最著名的,或者說使用最廣泛的就是Sybase PowerDesigner設計工具。


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

-Advertisement-
Play Games
更多相關文章
  • Linux單用戶CS模型TCP通訊完全註釋手冊 server 描述 實現一個簡單的Linux單用戶CS通訊,客戶端發送一串字元串,伺服器將其轉換為大寫後返回。 server 代碼 運行效果 客戶端輸入:hello,world 服務端轉換為大寫後返回,客戶端收到伺服器發回的數據後進行列印:HELLO, ...
  • http://www.cnblogs.com/targethero/p/5080499.html https://www.cnblogs.com/xiaojiang1025/p/6131381.html interrupts 一個電腦系統中大量設備都是通過中斷請求CPU服務的,所以設備節點就需要在 ...
  • 實驗材料準備 1,下載實驗材料hit-oslab-linux-20110823.tar.gz(包含linux-0.11源碼,bochs模擬器等) 網址:http://www.ritchiehuang.cn/ 2,下載安裝gcc-3.4(編譯linux-0.11需要用到低版本gcc) 網址:old-r ...
  • 進程線程及其狀態 進程 進程的概念 進程就是執行中的程式。 進程的狀態 進程有五種狀態,分別是: 新建:進程正在被創建 運行:進程正在被執行 阻塞:進程等待某個事件(如I/O操作) 就緒:進程等待分配處理器 終止:進程完成執行 進程調度流程圖 線程 線程的概念 線程是程式執行流的最小單元,線程早期也 ...
  • 以童話的方式深入淺出地講述了 Cortex M7 核心 MCU 的 ITCM 和 ICache 的原理、優勢和用法。 ...
  • Mysql中函數和存儲過程的區別 存儲過程: 1、 可以寫sql語句 2、 inout,out構造返回值 3、 調用:call:存儲過程名稱 4、 可以返回結果集 函數: 1、 不可以寫sql語句 2、 使用return 返回值 3、 調用時,使用函數名()即可 4、 不能獲取結果集 ...
  • 2.Orders訂單表 ...
  • ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...