Вопрос проектирования базы данных

Я строю базу данных как простое упражнение, она может быть размещена на любом сервере баз данных, поэтому я стараюсь поддерживать как можно более стандартные условия. По сути, я хотел бы сделать таблицу кодов, на которую ссылаются другие объекты. Я объясняю:

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 ответа

Решение

Я работал над системами с одной таблицей для всех кодов и другими с одной таблицей на код. Я определенно предпочитаю последний подход.

Преимущества таблицы на код:

  1. Внешние ключи. Как вы уже заметили, невозможно обеспечить соответствие допустимым значениям с помощью внешних ключей с помощью одной таблицы. Использование проверочных ограничений является альтернативным подходом, но он требует более высоких затрат на обслуживание.
  2. Спектакль. Поиск кода, как правило, не является узким местом производительности, но он, несомненно, помогает оптимизатору принимать разумные решения о путях выполнения, если он знает, что извлекает записи из таблицы с четырьмя строками, а не с четырьмя.
  3. Код группы. Иногда мы хотим организовать код в подразделы, обычно, чтобы упростить рендеринг сложных списков значений. Если у нас есть таблица на код, мы имеем большую гибкость, когда речь идет о структуре.

Кроме того, я заметил, что вы хотите иметь возможность развертывания "на любом сервере базы данных". В этом случае избегайте триггеров. Триггеры обычно являются плохими новостями в большинстве сценариев, но они имеют синтаксис для конкретного продукта.

То, что вы пытаетесь сделать, в большинстве случаев является ошибкой анти-шаблона и дизайна. Просто создайте разные таблицы вместо представлений.

В некоторых редких случаях такой дизайн имеет смысл. В этом виде включите поле 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)

Другие вопросы по тегам