推 SansWord:舉例: 身分證字號是我們的PK, (單一欄位 PK) 02/09 11:55
→ astt88:在我實務的經驗,不推薦用身份證字號做人的PK 02/09 12:24
→ astt88:因為遇到外國人怎麼辦? 02/09 12:25
→ astt88:故意用錯的身份證字號,一堆人都用A123456789 02/09 12:26
→ astt88:實務上,我比較傾向用流水號或GUID當PK 02/09 12:27
→ astt88:多欄主鍵會讓程式複雜化,且查詢速度慢 02/09 12:28
→ astt88:也不推薦用多欄主欄組成一個欄位做PK 02/09 12:30
→ astt88:因為需要確保此主鍵與組成欄位的一致性 02/09 12:33
→ astt88:且一般來說,用文字型態的PK欄位查詢速度比用數字型態的 02/09 12:34
→ astt88:PK欄位速度還慢 02/09 12:34
→ astt88:而且用多欄位組成一個欄位做PK,當組成欄位的資料有異動時 02/09 12:39
→ astt88:除了要更新PK欄位、PK組成欄位、所有的FK也必需要變更 02/09 12:39
→ astt88:請不要說,即然當成PK欄位,應該是不會被改變的資料 02/09 12:41
→ astt88:以我的經驗來說,發生過很多次這種情況,而且還滿常見的 02/09 12:44
→ astt88:客戶說要改這個資料,你說因為這是PK欄位所以不能改 02/09 12:48
→ astt88:一定會被客戶抱怨,要改也要花很多功夫 02/09 12:50
→ astt88:改一堆地方,還要確保無誤,工程滿浩大的 02/09 12:50
→ astt88:有些候選鍵會因為需求的變更,變得無法唯一識別該筆資料 02/09 13:10
→ astt88:這種PK失格,候選鍵失格的情況也是滿常見的 02/09 13:12
推 luciferii:外國人有護照號碼... 02/09 13:14
→ astt88:每一國的護照號碼的編碼規格不一樣,也難保一定不會重覆 02/09 13:23
推 lifeofenjoy:就因為邊碼規格不一樣. 所以不會有重複... 02/09 14:45
→ sayya2311:用流水號不好吧... 02/09 14:47
→ sayya2311:因為像帳號的login,你不可能叫使用者死記自己的流水號吧 02/09 14:48
→ sayya2311:或是像下單時, 若只提供客戶姓名時, 你能夠找出該使用 02/09 14:48
→ sayya2311:者正確的流水號嗎? 02/09 14:48
→ sayya2311:結果還是要靠使用者額外自訂一個不能重覆的id... 02/09 14:48
→ sayya2311:且讓它們成為PK, 這樣比較好吧... 02/09 14:49
→ astt88:姓名本來就會重覆,一堆菜市場名 02/09 15:16
→ astt88:應該很少有系統在Login時,是用姓名login的 02/09 15:17
→ astt88:通常會有另一個欄位存放使用者的登入帳號, 02/09 15:19
→ astt88:通常登入帳號這欄位,我會加上UNIQUE INDEX 02/09 15:23
→ astt88:流水號也是有分成給人看的,跟給系統看的 02/09 15:24
→ astt88:登入帳號也不建議成為PK,因為使用者可能有種種理由要修改 02/09 15:26
→ astt88:每個人有不同的設計理念,只是把我的經驗做分享 02/09 15:29
→ astt88:有些來自血淋淋的經驗與教訓 02/09 15:30
→ sayya2311:是可以這樣做沒錯... 02/09 17:47
→ sayya2311:但當你任何想以id去做的查詢, 都要先query id, 或JOIN 02/09 17:48
→ sayya2311:後才能查出的資料... 02/09 17:48
→ sayya2311:以id去查詢的需求很少嗎? 02/09 17:48
→ sayya2311:我想不見得, 尤其是後台的應用程式... 02/09 17:49
→ sayya2311:而去改變id的需求很多嗎? 02/09 17:49
→ sayya2311:我想也不見得, 因為放眼望去的網站, 允許你換id的也沒幾 02/09 17:49
→ sayya2311:個... 02/09 17:49
→ astt88:這要看需求,若你可以堅持登入帳號絕對不給換 02/09 19:22
→ astt88:那麼其實用ID(登入帳號)當PK也可以 02/09 19:24
→ astt88:其實ID也只有登入時需要而已,進入前後台後都可以不用ID 02/09 19:24
→ astt88:而且改用PK欄位做查詢,只有部分需要輸入ID的查詢頁面 02/09 19:25
→ astt88:才會查到ID (登入帳號) 02/09 19:26
→ astt88:以我的經驗,需要用到登入帳號欄位的機會在登入、寄忘記密 02/09 19:29
→ astt88:密碼函,查詢個人資料時 02/09 19:30
→ astt88:其餘的情況,大都可以用PK查詢到需要的資料 02/09 19:30
→ astt88:可能是我一直在專案型的公司上班 02/09 20:33
→ astt88:當客戶變更需求說要某資料也要能修改, 02/09 20:34
→ astt88:而這某資料剛好是資料表的PK欄位時,老闆也說OK時 02/09 20:34
→ astt88:可能會改得非常辛苦,客戶可能不會知道這個資料就是PK 02/09 20:34
→ astt88:你如何說服客戶說,某資料因為是PK,所以不能改? 02/09 20:34
→ astt88:所以,我比較傾向任何使用者看得到的欄位都不能當做PK 02/09 20:35
→ astt88:最多只能當候選鍵 02/09 20:35
→ astt88:當然了,這些做法都是見人見智的, 02/09 20:35
→ astt88:一切視需求跟情況而定,沒有什麼對錯 02/09 20:36
※ 編輯: astt88 來自: 59.105.83.207 (02/09 22:19)