Вопрос проектирования базы данных
Я строю базу данных как простое упражнение, она может быть размещена на любом сервере баз данных, поэтому я стараюсь поддерживать как можно более стандартные условия. По сути, я хотел бы сделать таблицу кодов, на которую ссылаются другие объекты. Я объясняю:
xcode
id code
r role
p property
code
r admin
r staff
p title
....
тогда я хотел бы иметь некоторое представление, как:
role (select * from code where xcode='r')
r admin
r staff
property (select * from code where xcode='p')
p title
тогда предположим, что у нас есть сущность
myentity
id - 1
role - admin (foreign key to role)
title - title (foreign key to property)
Очевидно, я не могу создать внешний ключ для представления, но это должно сказать идею, которую я имею в виду. Как я могу отразить такое поведение, когда это возможно, используя стандартный синтаксис SQL, а затем, в качестве второй опции, дополнительные возможности базы данных, такие как триггер ecc...?
Потому что если я скажу, что роль и заголовок в myentity являются внешним ключом к "коду", то вместо представлений ничто не помешает мне вставить роль в поле заголовка.
спасибо Леонардо
2 ответа
Я работал над системами с одной таблицей для всех кодов и другими с одной таблицей на код. Я определенно предпочитаю последний подход.
Преимущества таблицы на код:
- Внешние ключи. Как вы уже заметили, невозможно обеспечить соответствие допустимым значениям с помощью внешних ключей с помощью одной таблицы. Использование проверочных ограничений является альтернативным подходом, но он требует более высоких затрат на обслуживание.
- Спектакль. Поиск кода, как правило, не является узким местом производительности, но он, несомненно, помогает оптимизатору принимать разумные решения о путях выполнения, если он знает, что извлекает записи из таблицы с четырьмя строками, а не с четырьмя.
- Код группы. Иногда мы хотим организовать код в подразделы, обычно, чтобы упростить рендеринг сложных списков значений. Если у нас есть таблица на код, мы имеем большую гибкость, когда речь идет о структуре.
Кроме того, я заметил, что вы хотите иметь возможность развертывания "на любом сервере базы данных". В этом случае избегайте триггеров. Триггеры обычно являются плохими новостями в большинстве сценариев, но они имеют синтаксис для конкретного продукта.
То, что вы пытаетесь сделать, в большинстве случаев является ошибкой анти-шаблона и дизайна. Просто создайте разные таблицы вместо представлений.
В некоторых редких случаях такой дизайн имеет смысл. В этом виде включите поле xcode в первичный ключ / внешний ключ. Итак, ваша сущность будет выглядеть так:
myentity
id - 1
role_xcode
role - admin (foreign key to role)
title_xcode
title - title (foreign key to property)
Затем вы можете создать проверочные ограничения для принудительного применения role_xcode='r' и title_xcode = 'p'
(извините, я не знаю, являются ли они стандартными, они существуют в oracle и настолько просты, что я ожидаю их и на других rdbms)