Primary-Key

為什麼要明確密鑰?

  • May 10, 2016

我對數據庫這個主題很陌生,所以這聽起來可能很無知,但我很好奇為什麼應該在表中明確顯示一個鍵。這主要是為了告訴使用者給定的列值(希望)保證在每一行中是唯一的嗎?即使沒有提及,唯一性應該仍然存在。

您顯然是CONSTRAINT在建議數據庫中的 s 應該由訪問該數據庫的應用程序強制執行?

為什麼這是一個壞的(壞的,壞的……)想法有很多原因。

  1. 如果您正在建構一個“自己滾動”約束“引擎”(即在您的應用程式碼中),那麼您只是在模擬 Oracle/SQL Server/MySQL/PostgreSQL/<.whoever…> 所花費的寫作。多年來,他們的 CONSTRAINT 程式碼已經過數百萬最終使用者的測試。

  2. 恕我直言,您和您的團隊即使在幾年內也無法做到這一點——從這裡開始,僅 MySQL 程式碼就花費了 4000 萬美元。而 MySQL 是上述 3 台伺服器中最便宜的,它們甚至沒有實現 CHECK CONSTRAINTs。顯然,要完全正確地獲得 RI(參照完整性)是很困難的。

我曾經經常光顧 Oracle 論壇,但我無法告訴你有多少次一些糟糕的經理/程序員將一個項目強加給他,而之前有工作的天才有做你建議的“聰明”想法.

Jonathan Lewis(他寫了一本 550 頁的關於Oracle 優化器基礎知識的書)給出了否定的答案。他在另一本書中的 2 個設計災難(“橡木桌的故事” - 橡木桌是一組 Oracle 專家)是

  1. 我們將在應用程序級別檢查數據完整性,而不是利用 Oracle 的約束檢查能力。

3)即使奇蹟般地您可以正確實施 RI,您也必須一次又一次地為每個涉及該數據庫的應用程序**完全重新實施它 - 如果您的數據很重要,那麼新的應用程序也會這樣做。**選擇此作為範例將導致您和您的程序員同事(更不用說支持人員和銷售人員)過著不斷滅火和痛苦的生活。

您可以在此處此處此處詳細了解為什麼在應用程序級別實現數據約束簡直是瘋狂。

具體回答您的問題:

究竟為什麼要宣布它們?看起來很有幫助,但真的有必要有一個功能強大的數據庫嗎

聲明KEYs(或者PRIMARY,或只是普通的 es)的原因是FOREIGN,雖然數據庫不一定需要它們才能正常工作,但絕對****有必要聲明它們才能正常工作UNIQUE``INDEX

引用自:https://dba.stackexchange.com/questions/106539