Это немного религиозная дискуссия. Мое личное предпочтение состоит в том, чтобы иметь синтетические первичные ключи, а не естественные первичные ключи, но есть хорошие аргументы с обеих сторон. Реально, если вы последовательны и разумны, любой подход может работать хорошо.
Если вы используете естественные ключи, двумя основными минусами являются наличие составных клавиш и изменение значений первичного ключа.Если у вас есть составные первичные ключи, вы, очевидно, должны иметь несколько столбцов в каждой дочерней таблице. Это может стать громоздким с точки зрения модели данных, когда между объектами существует много связей. Но это может также вызвать горе для людей, разрабатывающих запросы - очень сложно создавать запросы, которые используют N-1 из N условий соединения и получают практически правильный результат. Если у вас есть естественные ключи, вы также неизбежно столкнетесь с ситуацией, когда значение натурального ключа изменится, и вам тогда придется пульсировать, что изменится через множество разных объектов - это намного сложнее, чем изменение уникального значения в таблице.
С другой стороны, если вы используете синтетические ключи, вы теряете пространство, добавляя дополнительные столбцы, добавляя дополнительные накладные расходы, чтобы поддерживать дополнительный индекс, и увеличиваете риск того, что получите функционально дублированные результаты. Очень сложно либо забыть создать уникальное ограничение для бизнес-ключа, либо увидеть, что в комбинации есть уникальный код, и просто предположим, что это уникальный индекс. На самом деле я просто укусил эту неудачную пару дней назад. Я проиндексировал составной естественный ключ (с уникальным индексом), а не создавал уникальное ограничение. Тупая ошибка, но это относительно легко сделать.
С точки зрения согласования запросов и именования я также предпочитаю синтетические ключи, потому что приятно знать, когда вы соединяете таблицы, что первичный ключ A будет A_ID, а первичный ключ B - будет B_ID. Это гораздо более самодокументируемо, чем попытка запомнить, что первичный ключ A - это комбинация A_NAME и A_REVISION_NUMBER, а первичный ключ B - B_CODE.
Иногда очень сложно определить ответ - все они такие хорошие :) –
Да, согласны. =) И способ SO работает по голосам и принятому ответу. Будьте хорошим судьей и выберите тот, который будет более полным. Возьмите место для новичков и прочитайте их, и попытайтесь выяснить, от какого ответа вы узнали или могли бы узнать больше всего. Никто не будет злиться на вас! ;-) Кроме того, люди будут рады помочь вам, отвечая на ваши вопросы, когда у них будет больше шансов увеличить свою репутацию (когда они этого заслуживают). Будьте осторожны и хорошо проводите день и ночь! =) –