2010-12-03 264 views
6

我想知道構建和存儲ID的最佳實踐是什麼。幾年前,一位教授向我講述了一個身份不好的身份證制度的危險,以社會安全號碼爲例。特別是,因爲SSN沒有任何錯誤檢測......所以不可能區分9位字符串和有效SSN。而現在政府機構需要諸如姓氏+ SSN或生日+ SSN之類的東西來跟蹤您的數據並確保其驗證。此外,根據您的出生地點,您的社會安全號碼有點可預測。數據庫ID最佳實踐

現在我正在構建一個用戶數據庫......並且基於此建議「userid mediumint auto_increment」將是不可接受的。特別是如果我打算使用此ID作爲用戶的主要標識。 (例如,如果我允許用​​戶更改他們的用戶名,那麼用戶名會比數字用戶標識更難以跟蹤...需要級聯外鍵等)。電子郵件發生更改,用戶名可能更改,密碼更改。但是用戶名應該永遠保持不變。

顯然,auto_increment只是爲surrogate_keys設計的。也就是說,只有當你已經有一個主要的識別機制時,它纔是有用的捷徑,但它不應該被用作數據的「固有標識符」。創建隨機的UUID看起來很有趣,但隨機性讓我失望。

所以我問:創建「主鍵」標識號的最佳做法是什麼?

+3

你的教授的建議是什麼讓你斷定自動遞增整數不適合作爲用戶數據的唯一標識符? – jwiscarson 2010-12-03 22:35:54

+0

自動遞增的整數是可預測的,不包含任何形式的錯誤檢測。至少,我希望「職業成績」身份證實踐有點不可預知和自我認同。例如,信用卡號碼有一個校驗和數字,這意味着如果人類錯誤地輸入信用卡,那麼只有1/10的機會被接受。它們也是不可預測的,所以黑客不能只在亞馬遜中輸入隨機信用卡號碼,並希望他甚至有一個有效的信用卡號碼。同樣,黑客不應該在可預測的UID上發送字典攻擊。 – Dragontamer5788 2010-12-03 22:43:03

+2

我不明白你的比較。如果信用卡公司使用實際的信用卡號碼作爲數據庫ID,而不是將它們作爲一些嚴重受保護的屬性存儲在表格中,我會感到震驚。您的評論意味着對ID的瞭解將成爲數據庫中的某種後門。某種類型的認證應該防止未經授權的數據訪問,而不是隨機數據庫值的知識。 – jwiscarson 2010-12-03 22:50:24

回答

7

您正在混淆內部數據庫功能與外部搜索條件。

自動增量代理鍵對內部應用程序的使用很有用。切勿將這些傳遞給用戶。識別業務對象,無論是用戶還是發票,都是通過關於對象的唯一信息完成的,如SSN,CCN或DOB。根據需要使用盡可能多的信息來唯一標識對象。

我強烈建議,如果您必須爲每位客戶提供一些新發明的ID值,那麼它不是連接所有客戶數據表的字段。

3

最佳做法是使用自動增量整數。沒有真正的理由不應該將它用作「先天標識符」。它將提供外鍵和最快搜索中最緊湊的用法。幾乎任何其他價值都可能改變,不適合用作關鍵。

1

將SSN與自動遞增整數進行比較是蘋果和桔子。就我個人而言,我會避免使用GUID/UUID/UID,除非表中會有太多記錄,以至於使用整數變得效率低下或不合理。

你很難找到真正的自然鑰匙。根據業務需求/法律,今天看起來獨一無二的明天可能會改變。

0

這是設計要解決的問題。創建一個可以每次插入都自動增加的對象。在一些數據庫中,自動遞增整數,在其他數據庫中,它是一個序列對象,但想法是相同的,即創建一個無法衝突且唯一的密鑰。

也作爲ID的UUID是好的,我之前使用過它的特殊原因。爲什麼隨機性會「關掉你」?幾乎沒有衝突的可能性。

0

在一天結束時,驗證給定用戶標識符是否有效的方法是系統本身。即,您的系統是這些標識符的權威來源。是555-45-9999有效的SSN?唯一可以確定的方法是讓社會保障局查找並將其與聲稱擁有該號碼的人的姓名相匹配。當然,我們可以使用SSN標識符方案來初步猜測它是否有效。但是,只有在他們的系統中查找肯定會告訴我們。例如,您可能希望允許其他人生成您的系統授予的號碼(例如允許客戶生成自己的跟蹤號碼的航運公司),那麼在高度分散的系統中就會出現對支票數字的需求。由於您的系統將以自動化方式生成標識符,因此最好的校驗位可以幫助您以基本方式驗證數據輸入或搜索。

1

根據我們在評論中的上述討論,我發佈這個答案。似乎您認爲爲用戶分配一個隨機的,唯一的ID會爲他們提供足夠的安全性,以至於您可以放棄正常的身份驗證方法。

無論如何,我比較了安全數據和自動遞增,用戶表中基於整數的ID列之間的混淆。這兩種數據永遠不會混雜在一起。您的信用卡公司不應將CCN用作數據庫表中的主鍵,政府也不應將您的名稱或SSN用作其數據庫表中的主鍵。

爲什麼你(或任何人)僅對進行身份驗證對某些安全數據的瞭解?公司不再允許根據其SSN對用戶進行身份驗證,而且我知道我的信用卡公司不會根據我的CCN識別我(特別是因爲我擁有多個帳戶,並且帳戶中的卡號已多次更改)。

即使您實現了UUID並生成了一些隨機數字,它仍然只是:號碼。 Active Directory身份驗證爲其ID使用GUID,但還要求用戶提供用戶名和密碼。使用更大或更小的數據類型作爲ID列並不意味着我可以洗手以進行其他類型的身份驗證或安全性。