既然你問了,這是好的做法,但在少數情況下(數據不需要連接),它可能不是絕對必需的。但最大的問題是,你永遠不知道需求是否會改變,所以你現在真的想要一個,所以你沒有在事實後添加一個到10米記錄表.....
除了主鍵(它可以跨越多列順便說一句)我認爲這是一個很好的做法,有一個第二候選人的關鍵是一個單一的領域。這使聯接更容易。
首先是一些理論。你可能還記得HS或者大學代數中函數的定義是:y = f(x)
其中f是一個函數,當且僅當每個x有一個y。在這種情況下,在關係數學中,我們會說在這種情況下y是functionally dependent
。
您的數據也是如此。假設我們正在存儲支票號碼,檢查賬戶號碼和金額。假設我們可能有多個支票賬戶,並且對於每個支票賬戶不允許有重複支票號碼,那麼金額在功能上取決於(賬戶,支票號碼)。一般而言,您希望將數據存儲在一起,這些數據在功能上依賴於同一事物,而無需傳遞依賴關係。主鍵通常是您指定爲主鍵的功能依賴關係。這然後識別行中的其餘數據(因爲它與該標識符相關聯)。把它看作是natural primary key.
儘可能(即不使用MySQL)我喜歡將主鍵聲明爲自然鍵,即使它橫跨列。有時你可能有多個可互換的候選鍵,這會變得複雜。例如,考慮:
CREATE TABLE country (
id serial not null unique,
name text primary key,
short_name text not null unique
);
此表真的可以有任何列作爲主鍵。這三個都是完全可以接受的候選鍵。假設我們有一個國家記錄(232,'美國','美國')。這些字段中的每一個都唯一標識記錄,因此如果我們知道其中一個我們可以知道其他字段。每一個都可以被定義爲主鍵。
我還建議擁有第二個人造候選鍵,它只是用於連接鏈接的機器標識符。在上面的例子中,country.id是這樣做的。這對於將其他記錄鏈接到國家/地區表格很有用。
需要候選關鍵字的例外情況可能是重複記錄真的可能存在的地方。例如,假設我們正在跟蹤發票。我們可能會有兩個項目獨立開具發票的情況,兩個項目中的每一個都會顯示一個項目。這些可能是相同的。在這種情況下,您可能希望添加一個人造主鍵,因爲它允許您稍後將事物連接到該記錄。你現在可能沒有必要這樣做,但你可能在將來!
只用一個索引來嘗試它,您不需要主鍵。獲取性能沒有的數字,看看它是否足夠快。 –
謝謝,我會嘗試。然而,從適當的關係角度來看,你會如何去做這樣的事情?這不像是你可以創建另一個表格來表示一個人的候選名單,因爲這還需要適應這樣一個事實,即我們不知道這個人會添加多少人。所以你不能爲每一個單獨列 - 你需要一個新的行 - 回到相同的情況哈哈! – user1058210
您創建了一個具有兩個用戶標識作爲列的表,因此您可以將某個人與其他人關聯起來,並且如果要強制執行唯一性,請創建一個由兩列組成的主鍵。 –