2011-11-07 51 views
2

我想我理解主鍵和索引。請確認我使用主鍵和唯一索引

在我的設置中,我有一個有幾列的表。其中兩列是用戶名和用戶名。 理想情況下,我希望兩者都是唯一的,並且不能爲空。

據我所知,我最好的用法是將用戶ID作爲主鍵,因爲這是最重要的字段而不是NULL,並且它不會隨着數據庫的增長而改變。

我然後必須將用戶名列作爲唯一索引,以便它可以在另一行上相同,但不幸的是,可能會結束NULL。

這是我會做什麼,除非有一種方法可以將兩個列都設置爲唯一且不可NULLABLE?

回答

0

從我的應用程序開發和數據倉庫經驗,我會建議有一個單獨的主鍵不使用任何業務設置,並且不要使用用戶ID作爲主鍵。使用UserID作爲主鍵可能會導致一系列問題。我會索引每列(分開)。

無論何時,如果您需要合併或重新分配用戶或更改他們的ID等,實際使用他們的用戶ID作爲主鍵會導致這些操作的很多問題。

此外,在網絡上,這會打開人們看到的網址,例如....user/1/details,然後可能會將「1」更改爲「2」(例如)並查看其他人的信息。如果ID是「57489574389ghfjghfjghf」這樣的唯一ID,那麼更好的辦法是破解URL。

之間的「自然」和「代理」鍵選擇是很好地解釋在這裏:
http://www.agiledata.org/essays/keys.html

大多數在這方面的問題的人的經驗,是邊緣的情況下,如合併和刪除。這些通常初期處於低優先級,但對它們的關注將隨着時間的推移而增長,而設計不佳的解決方案將開始崩潰(通常是因爲在數據質量被「識別」的時候,通常會有如此大量的「壞」數據前進是站不住腳的 - 舊數據不能「固定」,如果沒有這些規則很難引入與它們共存的新記錄,則假定仍然需要更新舊記錄的能力

+0

謝謝Michael,非常詳細的回答。我擁有創建內部網的豪華感,實際使用登錄功能的用戶非常少。目前,安全性僅次於功能,儘管未來這可能會發生變化,因爲目前沒有以這種方式保護敏感數據,只有用戶偏好。 – Eds

+1

@Eds:我不同意......「最好是ID是唯一的,比如'57489574389ghfjghfjghf'」是一個可怕的建議。這就像說你的ID一直是一個GUID。 用戶能夠使用.../user/2/details來刮擦網站,這是糟糕的應用程序設計和錯誤。不應該因數據庫設計不當而過度補償。 –

4

您可以將用戶名列聲明爲NOT NULL,並在其上放置一個唯一索引。雖然索引本身不會強制非空值,但字段定義將會,因此它將實際上是一個唯一的非空字段

+0

謝謝,這可能是我會一起去的! – Eds

0

Nop,對不起,說你不正確,在這兩個帳戶。

1)正確的一切,除了PK可以改變,如果你想要它。

2)根據定義,唯一索引是唯一的,它不能重複。你的意思是一個普通的舊索引,不是唯一的,可以重複。其目的是加速查詢您是否經常按該字段過濾。否則最好不要使用它。你想要什麼:Column1 =主鍵(非空),Column2 =唯一索引(非空),正是你所說的,但現在你知道它爲什麼會按你的需要工作。

編輯:另外,它似乎你做索引和非空值之間的相關性。您可以創建一個不可爲空的列,而不管它是否爲索引。

+0

感謝您的回答 – Eds

0

完全同意邁克爾,你的主鍵列不應該包含任何有意義的數據,特別是像userID。所以你應該爲PK添加一個列並從一個序列中填充它。

也同意Darhazer:你應該在userid和username兩個字段上放置一個非空約束和一個唯一索引。

+0

非常感謝! – Eds