關于主鍵的設計、primary key

主鍵:用于唯一標識一個表中一行數據。

外鍵:用于建立兩個表之間的關系,A表中有一列是B表中的主鍵,那么A表中這列的數據就受到B表主鍵的約束。

那么關于主鍵應該如何設計呢,這里我說下優缺點:

1.用自動增長字段作為主鍵,這樣的主鍵可以稱之為 非業務主鍵(或邏輯主鍵、或代理主鍵),就是說這列與業務無關,僅僅是作為主鍵而設計。

優點:自增長字段往往是integer bigint類型,最多占8個字節。索引與外鍵 所占用的空間連帶減少,增刪改查 效率高。業務變化,不影響,不需要更新主鍵。

缺點:無法轉移數據庫,比如把表中的一批數據 轉移 或 附帶到 另一個表中,那么由于是自增長字段,那么會導致無法轉移,因為另外一個表可能已經存在部分數據,會造成主鍵沖突。自增長字段的缺陷。

? ? ? ? 業務數據的完整性,無法保證。

?

2.用全球唯一標識符GUID,來做主鍵。依然是非業務主鍵。

優點:可以轉移數據庫。業務變化,不影響,不需要更新主鍵。

缺點:字符串較長,占用的空間較多,如果用于外鍵的話,會導致連帶其它表占用的空間連帶增多。A表中有一列是B表中的主鍵 ,那么A表中的這列也是需要有個索引的,即存儲空間會連帶增多。效率變低。

? ? ? ? 即除了正常業務字段外,還是弄個字符串字段來專一保存這個全球唯一標識符,造成存儲浪費。業務數據的完整性,無法保證。

?

3.用業務字段做主鍵。

優點:可以轉移數據庫,最大化節省了空間,因為并沒有 多增加一個非業務字段做主鍵。業務數據的完整性,可以保證。避免產生垃圾數據,銀行就是用業務字段做主鍵的,雖然效率低,但是安全。

缺點:如果業務發生改變,有可能需要修改主鍵,舉例:國家A表用身份證號做主鍵,然后其他很多表中的身份證號這列都是來自 身份證表A中的主鍵(即外鍵),那么如果身份證號升級,比如從1代升級到2代,那么

? ? ? ? 那么連帶的表的外鍵 的索引 通通都得發生變化,效率極低 因為會連帶更新一串用到這個外鍵的表,可見用業務字段做主鍵的話,你得保證 主鍵不經常變化。

?

==============

綜上:用哪種方式做主鍵,還是得看業務需求,實際情況,實事求是。根據情況選擇,沒有固定的標準。

轉載于:https://www.cnblogs.com/del88/p/6719176.html

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/252884.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/252884.shtml
英文地址,請注明出處:http://en.pswp.cn/news/252884.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

淺談微信smali注入

作者:郭少雷 搞android搞了幾年也沒搞出個啥牛逼app出來,眼看時下最火的app微信如此火熱,實在想搞搞它,索性就想著給它加點東西進去。 以下內容純屬本人個人愛好,僅限個人學習android用途以及對android的深入了解。 首…

從0到1使用Kubernetes系列(四):搭建第一個應用程序

上一篇文章《從0到1使用Kubernetes系列(三):使用Ansible安裝Kubernetes集群》中,我們搭建了一套Kubernetes集群,接下來將在本文中介紹如何使用Kubernetes部署一個Nginx并通過Pod IP、Service IP、Ingress這三種方式訪問…

Embeded linux之移植iptables

一、內核環境&#xff1a; linux-3.4.35 -*- Networking support ---> Networking options ---> [*] Network packet filtering framework (Netfilter) ---> IP: Netfilter Configuration ---> <*> IP tables support (required for filtering/masq/NAT)…

Hadoop HIVE

數據倉庫工具。構建在hadoop上的數據倉庫框架&#xff0c;可以把hadoop下的原始結構化數據變成Hive中的表。&#xff08;主要解決ad-hoc query&#xff0c;即時查詢的問題&#xff09; 支持一種與SQL幾乎完全相同的語言HQL。除了不支持更新&#xff0c;索引和事務&#xff0c;幾…

Xcode9學習筆記67 - 打印查看程序沙箱結構中常用的幾個目錄

override func viewDidLoad() {super.viewDidLoad()// Do any additional setup after loading the view, typically from a nib.//首先獲得應用程序目錄的路徑&#xff0c;在該目錄下有三個文件夾&#xff1a;文檔目錄、庫目錄、臨時目錄以及一個程序包。該目錄就是應用程序的…

檢測raid類型和磁盤壞道腳本

#!/bin/sh #腳本功能&#xff1a; #安裝工具MegaCli64 #Host Information&#xff1a;主機名和ip地址 #Raid Information&#xff1a;raid信息和充電狀態 #WARNING Information&#xff1a;MediaErrcount檢測壞塊和哪塊盤 #Disk Information&#xff1a;磁盤信息 #上傳MegaC…

簡單論述市場營銷管理的基本過程

http://www.chinadmd.com/file/uvc3uaosocwevsetrzpaereo_1.html

Javascript-Switch

JavaScript Switch 語句 請使用 switch 語句來選擇要執行的多個代碼塊之一。 語法 switch(n) { case 1:執行代碼塊 1break; case 2:執行代碼塊 2break; default:n 與 case 1 和 case 2 不同時執行的代碼 }工作原理&#xff1a;首先設置表達式 n&#xff08;通常是一個變量&…

《SpringBoot揭秘 快速構建微服務體系》讀后感(三)

SpringApplication&#xff1a;SpringBoot程序啟動的一站式解決方案 深入探索SpringApplication執行流程 因為書上的版本是1.2的&#xff0c;比較老&#xff0c;這里參考http://blog.csdn.net/zxzzxzzxz123/article/details/69941910 public ConfigurableApplicationContext ru…

裝飾器函數

1.裝飾器 ? 裝飾器&#xff1a;在不改變原函數的調用方式和函數&#xff0c;額外的增加功能 簡單裝飾器def timer(func):def inner():print(time.time())func() # 原來的函數return inner ? timer # func1 timer(func1) def func1():print(func1) 函數帶返回值def timer…

6G SDI/12G SDI 基帶信號無壓縮傳輸方案介紹

認知數字像素分辨率&#xff1a; 首先從分辨率(數字像素)角度來講&#xff0c;從標清時代走到高清&#xff0c;從720x576到現在的1920x1080&#xff0c;寬高比從4:3到16:9&#xff0c;這個是我們比較熟悉的&#xff0c;4K實際上是建立在高清基礎之上的&#xff0c;我們稱之為“…

4月18日

u盤丟了&#xff0c;毀滅性的災難 希望明天可以找到它&#xff0c;不然萬字的策劃案就要重寫 這是一個災難 轉載于:https://www.cnblogs.com/dandansang/p/6731174.html

玩轉SSH端口轉發

ssh端口轉發(tunnel) 我們在實施項目部署時經常會遇到一種問題&#xff0c;那就是當我們給一些安全系數高的客戶部署服務時&#xff0c;大多都不會給我們提供公網訪問的權限&#xff0c;但是很多時候為了方便又會允許服務器直接訪問公網&#xff0c;遇到這種情況大多有兩種辦法…

12.4日團隊工作總結

今天團隊的主要任務是注重于畫圖工具的設計&#xff0c;這就意味著我們首要的任務是將畫圖工具設置出來并可以完整運行&#xff0c;接下來才能顧及之前的改圖軟件&#xff0c;但今天在設計的過程中&#xff0c;遇到了兩者無法無縫結合的問題&#xff0c;目前還沒解決。 轉載于:…

WIFI DFS測試介紹

http://www.eefocus.com/summer12200/blog/09-02/166038_b9094.html 1. 概述: 目前在802.11系列標準中&#xff0c;涉及物理層的有4個標準&#xff1a;802.11、802.11b、802.11a、802.11g。根據不同的物理層標準&#xff0c;無線局域網設備通常被歸為不同的類別&#xff0c;如…

git 遠程倉庫版本的回退以及git reset 幾種常用方式記錄

由于 github push 了兩個比較潦草的commit, 自己很不滿意&#xff0c;又不想重新開vpn進行上傳&#xff0c;所以找了一下相關的教程。 最后研究了一下&#xff0c;原理為先在本地還原到你想要的commit,然后強制push 到遠程倉庫&#xff0c;強制將遠程倉庫還原到你想要的commit.…

【PHP】詳解 $_SERVER 函數中QUERY_STRING和REQUEST_URI、SCRIPT_NAME、PHP_SELF區別

實例&#xff1a;1、http://localhost/index.php/Home/Home/index.html $_SERVER[QUERY_STRING] ""; $_SERVER[REQUEST_URI] "/index.php/Home/H1/index.html";$_SERVER[SCRIPT_NAME] "/index.php";$_SERVER[PHP_SELF] "/index.php/H…

微軟發布Azure Cosmos DB產品以及新的物聯網解決方案

微軟于當地時間2018年12月4日召開了一年一度的以云計算和數據為中心的開發者大會&#xff0c;在會上微軟正式發布Azure機器學習服務(Azure Machine Learning service)&#xff0c;這是一個云平臺&#xff0c;允許開發人員構建、訓練和部署AI模型&#xff0c;并對Azure認知服務(…

安裝Windows10,Ubuntu雙系統14.04LTS記錄

兩種方式都可以制作https://jingyan.baidu.com/article/19192ad85aa445e53e5707c2.htmlhttps://www.cnblogs.com/arcsinw/p/5303615.html

物理層、數據鏈路層網絡設備工作原理

物理層網絡設備有中繼器、集線器。 中繼器的功能是將接收到的信號進行再放大然后傳輸出去&#xff0c;作用是將擴展網絡設備信號傳輸的物理范圍&#xff0c;缺點是擴大數據信號的同時也擴大的噪聲&#xff0c;不能夠進行廣播隔離&#xff0c;網絡利用率很低&#xff0c;現在基本…