Таблицы поиска (или таблицы кодов , как их называют некоторые люди) обычно представляют собой набор возможных значений, которые могут быть заданы для определенного столбца.
Например, предположим, что у нас есть справочная таблица party
(предназначенная для хранения информации о политических партиях), которая имеет два столбца:
party_code_idn
, который содержит сгенерированные системой числовые значения и (без значения бизнес-области ) работает как суррогат для реального ключа.party_code
, является реальным или «естественным» ключом таблицы, потому что он поддерживает значения, имеющие коннотации бизнес-домена .
И допустим, что в такой таблице сохраняются следующие данные:
+----------------+------------+
| party_code_idn | party_code |
+----------------+------------+
| 1 | Republican |
| 2 | Democratic |
+----------------+------------+
party_code
Колонна, которая сохраняет значения «Республиканский» и «демократическая», будучи реальным ключом таблицы, устанавливается с ограничением UNIQUE, но необязательно , добавил party_code_idn
и определил его как PK таблицы (хотя, говоря логически , party_code
может работать как ПЕРВИЧНЫЙ КЛЮЧ [PK]).
Вопрос
Каковы лучшие методы для указания на значения поиска из таблиц транзакций ? Должен ли я установить ссылки FOREIGN KEY (FK) либо (a) непосредственно на естественную и значимую ценность, либо (b) для суррогатных значений?
Вариант (а) , например,
+---------------+------------+---------+
| candidate_idn | party_code | city |
+---------------+------------+---------+
| 1 | Democratic | Alaska |
| 2 | Republican | Memphis |
+---------------+------------+---------+
имеет следующие свойства 1 :
- Читается для конечного пользователя (+)
- Легко импортировать-экспортировать через системы (+)
- Трудно изменить значение, так как оно требует модификации во всех ссылочных таблицах (-)
- Добавление нового значения не требует больших затрат (=)
Я думаю, что это почти как « передать по значению », провести аналогию из вызова функции на языке программирования приложений.
Вариант (б) , например,
+---------------+----------------+---------+
| candidate_idn | party_code_idn | city |
+---------------+----------------+---------+
| 1 | 1 | Alaska |
| 2 | 2 | Memphis |
+---------------+----------------+---------+
имеет свойства ниже:
- Не читается для конечного пользователя (-)
- Сложно импортировать-экспортировать, так как нам нужно отменить ссылку на него (-)
- Легко изменить значения, так как мы храним ссылки только в таблицах транзакций (+)
- Добавление нового значения не требует больших затрат (=)
Это очень похоже на « передачу по ссылке », если сравнивать с вызовом функции на языке программирования приложения.
Импорт-экспорт также может быть выполнен по-другому, т. Е. Просто заполнив таблицу поиска снова, а затем заново заполнив суррогатный столбец. Надеюсь, я правильно понял, это то, что я только что услышал как возможность.
1. Обратите внимание , что +
, -
и =
указывают на преимущество этих свойств.
Вопрос
Очень важно: есть ли разница между таблицей поиска (или кодом ) и ссылкой на FK, если мы просто собираемся использовать последний подход? Я думаю, что они работают точно так же.
FOREIGN KEY
в другой таблице, он может быть довольно грязным, но YMMV.UNIQUE CONSTRAINT
s иNOT NULL
s - ну, ваши записи в таблице кодов находятсяFOREIGN KEY
в таблицах, которые используют / ссылаются на них - поэтому понятия связаны, но не совпадают. Суррогатный ключ таблицы кодов - это поле, которое появляется в «дочерней» таблице - конечно, оно менее разборчиво, ноINT
не очень большое - не требуется много места, что является преимуществом суррогатных ключей.Существует третий подход, который имеет некоторые преимущества двух ваших вариантов - поместить реальный код в таблицу кодов. Под этим я подразумеваю короткую последовательность символов, которая отражает сущность полной стоимости и является уникальной. Для вашего приведенного примера это может быть
Код переносится в транзакционные таблицы как внешний ключ. Это короткий, понятный и несколько независимый от "реальных" данных. Инкрементальные изменения имени не предполагают изменения кода. Однако, если республиканцы выйдут в массовом порядке , может потребоваться изменение кода с сопутствующими проблемами, которые суррогатное удостоверение не будет нести.
Этот стиль был назван аббревиатурой. Я могу рекомендовать письмо Селко по этому вопросу. Google книги содержит несколько примеров. Поиск "Celko кодирования".
Другие примеры: 2- или 3-буквенное кодирование для стран, 3-буквенное кодирование (GBP, USD, EUR) для кодов валют. Коротко, самоочевидно и не меняется (и для них есть ISO).
источник