Если вы удалите таблицу PaymentType, вы замените проверку внешнего ключа на ограничение таблицы CHECK:
PaymentType CHAR(6) NOT NULL CHECK(PaymentType IN('Cash', 'Credit', 'Cheque')
ОК & mdash; вы пишете «чек» как «чек»; просто еще одно различие между английским и американским.
Теперь это значительно затрудняет поиск возможных значений; Вы должны проанализировать системный каталог, чтобы узнать. С отдельной таблицей вы можете изучить отдельную таблицу, чтобы узнать, что разрешено. Предположим, вы начали отслеживать «Дебет» отдельно от «Кредит»; Вы добавляете строку в таблицу против изменения схемы таблицы. Предположим, вы решили записать, какие коды разрешены в будущих транзакциях (поэтому «Наличные» перестают быть опцией). Вы можете добавить столбец в таблицу Тип оплаты, чтобы указать, что этот код больше не действителен; гораздо сложнее сделать это с простым ограничением CHECK.
Таким образом, даже если в настоящее время у вас есть ограниченные или нет дополнительных данных в таблице «Тип платежа», я бы использовал таблицу «Тип платежа» вместо того, чтобы встраивать тип платежа в таблицу «Платежная операция».
Если бы это был мой дизайн, я бы, вероятно, использовал бы код CHAR (1) или CHAR (2) в качестве идентификатора для типа платежа, а не числовой столбец. Конечно, все три типа начинаются с «C», поэтому, возможно, вы бы использовали «A» для cAsh, «H» для cHeck и «R» для cRedit (и, возможно, «D» или «E» для дебета или dEbit) с кодом CHAR (1); с CHAR (2) вы бы использовали «CA», «CH», «CR» (и, возможно, «DE»). Полное имя можно сохранить в таблице типов платежей для использования в отчетах. В этом случае преимущества невелики, но экономят 4 байта на запись на достаточном количестве записей (достаточно большое количество достаточно маленьких записей), и это может стать фактором затрат на хранение. Конечно, индексные накладные расходы также вступают в игру; если столбец в таблице «Платежная операция» должен быть проиндексирован, то поле меньшего размера использует меньше места для индекса.