日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > 数据库 >内容正文

数据库

【Normal Form】数据库表结构设计所遵从的范式

發布時間:2024/9/5 数据库 39 豆豆
生活随笔 收集整理的這篇文章主要介紹了 【Normal Form】数据库表结构设计所遵从的范式 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

目錄

  • 1.?第一范式:原子性,不可再分
  • ???1.1.?是否為原子性
  • ???1.2.?典型的例子:多個信息用分隔符拼接記錄
  • 2.?第二范式:非主鍵必須完全依賴于主鍵,而不能只依賴于主鍵的一部分
  • ???2.1.?不符合此特性的示例
  • 3.?第三范式:非主鍵必須直接依賴于主鍵,而不是傳遞依賴或間接依賴
  • ???3.1.?不符合此特性的示例
  • 4.?后話
  • 5.?參考的優秀文章

數據庫設計是件嚴肅、關鍵的事兒,一畢業,加入一個大型的行業項目,那兒的前輩資深工程師,就給我灌輸數據庫如何關鍵、神圣、深不可測的觀念,所以,我一直懷著崇拜的眼神。

幾年前,項目經理把一個小項目的數據庫設計工作交給我,我除了花費晚上和周末去完成。后來,更由于第一次負責整個系統的數據庫設計,更請教了以前公司的架構師哥們,幫我把把關,看自己有哪些木有想到的。

后來,將設計方案通過了評審,甚是高興,畢竟自己第一次設計一個系統的表結構,盡管,是一個小系統。

?

那么,有了幾次數據庫表結構設計經驗,如何描述你設計表所遵循的原則呢?這時候,回歸到大學課本,就是范式(Normal Form)。

?

1. 第一范式:原子性,不可再分

原子性,即,字段應該是不可再分的。

?

1.1. 是否為原子性

如,一個系統的地址用于郵寄商品,那么下表的ADDRESS是符合第一范式的。

IDUSER_NAMEAGEPHONEADDRESS
1Nick Huang1812345678深圳市羅湖區地王大廈1003室

?

而如何判斷是否原子性,這需要根據實際的業務判斷。

比如一些系統僅根據地址作送貨服務的,則使用上述的結構即滿足第一范式;而某些系統,地址除了用于送貨,還需要對用戶所在地區分布做長期的統計,為了統計方便,上面的ADDRESS設計就不符合原子性了,也許應該為:

IDUSER_NAMEAGEPHONEPROVINCECITYADDRESS
1Nick Huang1012345678廣東省深圳市地王大廈1003室

?

1.2. 典型的例子:多個信息用分隔符拼接記錄

還有其他一些典型的不符合原子性的,就是將多個數據放在一個字段中了。

如Phone字段:

IDUSER_NAMEAGEPHONE
1Nick Huang1023658745,25654150

?

還有這種情況,如EXT_FIELDS字段:

IDUSER_NAMEAGEPHONEADDRESSEXT_FIELDS
1Nick Huang1012345678深圳市XXX<DATA><JOB>Programmer</JOB><PASSPORT>12345678</PASSPORT></DATA>

?

2. 第二范式:非主鍵必須完全依賴于主鍵,而不能只依賴于主鍵的一部分

非主鍵必須完全依賴于主鍵,而不能只依賴于主鍵的一部分(聯合主鍵)

?

2.1. 不符合此特性的示例

博文《權限管理系統概要設計》有一系列用戶權限的表,如果以此為例子,將其中的表結構設計為如下,則不符合第二范式:

USER_ID、ROLE_ID為主鍵,描述用戶和角色的關聯關系;STATUS描述這個關聯關系是生效還是失效。

可以看出,STATUS是描述這段關聯的,是依賴USER_ID、ROLE_ID的,即完全依賴于主鍵。

而USER_NAME是用戶名稱,它只依賴于USER_ID,即只依賴于主鍵的一部分。USER_NAME字段的設置不符合第二范式。

?

如果有一天,用戶的名稱需要修改,那么就要修改與此用戶相關的每一筆關聯的數據。

?

3. 第三范式:非主鍵必須直接依賴于主鍵,而不是傳遞依賴或間接依賴

非主鍵必須直接依賴于主鍵,而不是傳遞依賴或間接依賴。

?

3.1. 不符合此特性的示例

博文《權限管理系統概要設計》有一系列用戶權限的表,如果以此為例子,將其中的表結構設計為如下,則不符合第三范式:

此為角色表,ID為角色ID,NAME為角色名稱,STATUS為此角色是否生效,SYSTEM_ID為此角色所屬的系統ID,SYSTEM_NAME為此角色所屬的系統的名稱。

可以看出SYSTEM_NAME為傳遞依賴,在角色表中SYSTEM_ID依賴與ID,而SYSTEM_NAME有依賴與SYSTEM_ID。SYSTEM_NAME字段的設置不符合第三范式。

?

4. 后話

是不是數據庫設計一定得嚴格遵守3范式呢?

這不一定,要視具體情況,實際上,常見許多情況故意設置冗余字段使系統查詢更高效、更方便。

轉載于:https://www.cnblogs.com/CandiceW/p/10033424.html

總結

以上是生活随笔為你收集整理的【Normal Form】数据库表结构设计所遵从的范式的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。