Това е малко религиозен дебат. Моето лично предпочитание е да имам синтетични първични ключове, а не естествени първични ключове, но има добри аргументи и от двете страни. Реално погледнато, стига да сте последователни и разумни, и двата подхода могат да работят добре.
Ако използвате естествени ключове, двата основни недостатъка са наличието на съставни ключове и променящите се стойности на първичния ключ. Ако имате съставни първични ключове, очевидно ще трябва да имате няколко колони във всяка дъщерна таблица. Това може да стане тромаво от гледна точка на модел на данни, когато има много връзки между обекти. Но също така може да причини скръб на хората, разработващи заявки - ужасно лесно е да създавате заявки, които използват N-1 от N условия за свързване и да получите почти правилния резултат. Ако имате естествени ключове, вие също така неизбежно ще се сблъскате със ситуация, в която стойността на естествения ключ се променя и след това трябва да пренесете тази промяна през много различни обекти - това е много по-сложно от промяната на уникална стойност в таблицата.
От друга страна, ако използвате синтетични ключове, вие губите място чрез добавяне на допълнителни колони, добавяне на допълнителни разходи за поддържане на допълнителен индекс и увеличавате риска да получите функционално дублирани резултати. Ужасно лесно е или да забравите да създадете уникално ограничение за бизнес ключа, или да видите, че има неуникален индекс в комбинацията и просто да приемете, че това е уникален индекс. Всъщност бях ухапан от този конкретен провал преди няколко дни - бях индексирал съставния естествен ключ (с неуникален индекс), вместо да създам уникално ограничение. Тъпа грешка, но е сравнително лесна за допускане.
От гледна точка на писане на заявки и конвенция за именуване, аз също бих предпочел синтетичните ключове, защото е хубаво да знаете, когато се присъединявате към таблици, че първичният ключ на A ще бъде A_ID, а първичният ключ на B ще бъде B_ID . Това е много по-самодокументиращо се от опитите да запомните, че първичният ключ на A е комбинацията от A_NAME и A_REVISION_NUMBER и че първичният ключ на B е B_CODE.
person
Justin Cave
schedule
10.02.2011