3 回答

TA貢獻(xiàn)1827條經(jīng)驗(yàn) 獲得超9個(gè)贊
如果你打算做與偶爾連接的應(yīng)用程序數(shù)據(jù)庫(kù)之間的同步,那么你應(yīng)該使用的GUID為您的主鍵。它是一種用于調(diào)試的痛苦,從這種情況下,我傾向于堅(jiān)持整數(shù)是自動(dòng)增量如此分開。
自動(dòng)增量整數(shù)應(yīng)該是默認(rèn)的,并沒有使用它們應(yīng)該是合理的。

TA貢獻(xiàn)1807條經(jīng)驗(yàn) 獲得超9個(gè)贊
我沒有看到一個(gè)答案可以指出(我認(rèn)為)真正的基本要點(diǎn)-即,主鍵可以確保您不會(huì)在表中獲得同一真實(shí)世界實(shí)體的兩個(gè)條目(例如在數(shù)據(jù)庫(kù)中建模)。該觀察有助于確定主鍵的優(yōu)點(diǎn)和缺點(diǎn)。
例如,在(美國(guó))狀態(tài)名稱和代碼表中,名稱或代碼可以是主鍵-它們構(gòu)成兩個(gè)不同的候選鍵,并且選擇其中一個(gè)(通常是較短的-代碼)作為主鍵。首要的關(guān)鍵。在功能相關(guān)性(以及連接相關(guān)性-1NF到5NF)的理論中,關(guān)鍵的是候選鍵而不是主鍵。
作為反例,人名通常是主鍵的錯(cuò)誤選擇。有很多人以“約翰·史密斯”(John Smith)或其他類似的名字命名;即使考慮到中間名(請(qǐng)記住:并非每個(gè)人都有一個(gè)中間名,例如,我沒有),重復(fù)的空間很大。因此,人們不會(huì)將名稱用作主鍵。他們發(fā)明了諸如社會(huì)安全號(hào)(SSN)或員工號(hào)之類的人工密鑰,并使用它們來(lái)指定個(gè)人。
理想的主鍵應(yīng)簡(jiǎn)短,獨(dú)特,令人難忘且自然。在這些特征中,唯一性是強(qiáng)制性的;鑒于現(xiàn)實(shí)世界數(shù)據(jù)的限制,其他人必須靈活應(yīng)對(duì)。
因此,在確定給定表的主鍵時(shí),您必須查看該表代表什么。表中哪些集合或哪些列值集合唯一標(biāo)識(shí)表中的每一行?這些是候選鍵?,F(xiàn)在,如果每個(gè)候選鍵由4或5列組成,那么您可能會(huì)認(rèn)為這些鍵太笨拙而不能做成一個(gè)好的主鍵(主要是出于簡(jiǎn)短的考慮)。在這種情況下,您可能會(huì)引入一個(gè)替代密鑰-一個(gè)人工生成的數(shù)字。通常(但不總是),一個(gè)簡(jiǎn)單的32位整數(shù)足以替代代理密鑰。然后,您可以將此代理鍵指定為主鍵。
但是,您仍然必須確保將其他候選鍵(對(duì)于替代鍵也是候選鍵,以及所選的主鍵)都保持為唯一標(biāo)識(shí)符-通常是通過(guò)在那些列集上設(shè)置唯一約束。
有時(shí)候,人們發(fā)現(xiàn)很難識(shí)別什么使行變得獨(dú)特,但是應(yīng)該做些什么,因?yàn)閮H僅重復(fù)一條信息并不能使它變得更真實(shí)。而且,如果您不小心并且確實(shí)得到兩(或更多)行聲稱要存儲(chǔ)相同的信息,然后又需要更新該信息,則有一種危險(xiǎn)(尤其是如果您使用游標(biāo)),您只會(huì)更新一行而不是每一行,因此這些行是不同步的,沒有人知道哪一行包含正確的信息。
在某些方面,這是一個(gè)很強(qiáng)硬的觀點(diǎn)。
我在需要時(shí)使用GUID并沒有特別的問題,但是它們往往很大(如16-64字節(jié)),而且使用頻率也很高。通常,一個(gè)很好的4字節(jié)值就足夠了。由于每個(gè)索引頁(yè)的值較少,因此使用4字節(jié)值的GUID會(huì)浪費(fèi)磁盤空間,并且甚至減慢索引訪問數(shù)據(jù)的速度,因此索引將更深,必須讀取更多頁(yè)才能到達(dá)索引。信息。

TA貢獻(xiàn)1993條經(jīng)驗(yàn) 獲得超6個(gè)贊
這只是一個(gè)宗教問題,因?yàn)槿藗儗で笃毡榈恼_答案。您的團(tuán)隊(duì)和該SO線程都顯示出很大的分歧這一事實(shí)應(yīng)該表明,有充分的理由在不同情況下使用您描述的所有解決方案。
如果表中沒有其他屬性或一組屬性適合于唯一地標(biāo)識(shí)行,則代理鍵很有用。
在可能的情況下,最好使用自然鍵,以使表更易于閱讀。自然鍵還允許從屬表中的外鍵包含實(shí)際值而不是代理ID。例如,當(dāng)您需要存儲(chǔ)
state
(CA,TX,NY)時(shí),最好使用char(2)
自然鍵而不是int。在適當(dāng)?shù)牡胤绞褂脧?fù)合主鍵。
id
當(dāng)存在完美的復(fù)合鍵時(shí),不要不必要地添加“ ”替代鍵(在多對(duì)多表中尤其如此)。在每個(gè)表中對(duì)三列鍵的授權(quán)都是絕對(duì)的廢話。當(dāng)您需要在多個(gè)站點(diǎn)上保留唯一性時(shí),GUID是一種解決方案。如果您需要主鍵中的值唯一但又不是有序或連續(xù)的,則它們也很方便。
INT vs. BIGINT:表需要主鍵的64位范圍并不常見,但是隨著64位硬件可用性的增加,它不應(yīng)該成為負(fù)擔(dān),并且可以確保您不會(huì)溢出。INT當(dāng)然較小,因此,如果空間有限,則可以帶來(lái)一點(diǎn)優(yōu)勢(shì)。
添加回答
舉報(bào)