2014-01-27 1 views
0

У меня есть база данных Oracle с тремя таблицами:Как сделать ссылочную целостность?

Table1: Vehicle

  • ID
  • Тип
  • Item

TABLE2: Car

  • ID
  • Марка

Таблица3: Bus

  • ID
  • Номер шины

В таблице 1:

  • , если тип транспортного средства Car, я хочу колонку Item для хранения ID от Car стол;
  • если тип автомобиля Bus, я хочу колонку Item для хранения ID от Bus стол;

Это создает проблему при связывании таблиц с внешними ключами ограничений, потому что если, например, я выбираю автомобилей ID в автомобиле таблицы, что не существует в Bus Таблицы, Oracle вызовет ошибку.

Что я делаю на самом деле, я обрабатывать таблицы без каких-либо отношений, но я столкнулся риск несоответствия данных, в случае строки из таблиц Bus или автомобилей будут удалены.

У кого-нибудь есть идеи, пожалуйста?

+0

Вы не можете иметь внешний ключ, который ссылается на одну таблицу один раз, а другую таблицу в другом случае. Решение будет состоять в том, чтобы на вашей базовой таблице были «CarID» и «BusID», каждый из которых ссылался либо на таблицу «Car», либо на «Bus», и убедиться, что только один может быть чем-то иным, чем NULL в любой момент времени. –

ответ

1

Поскольку Oracle поддерживает отложенные внешние ключи, вы можете обеспечить как присутствие, так и эксклюзивность «дочерних» строк. Точный метод объясняется: How to create multiple one to one's

  • Первой часть связанного поста не использует явный тип дискриминатора, но достигает как исключительность и присутствие. Фактически, NULL-способность «обратных» FK действует как дискриминатор типа.
  • Вторая часть связанного сообщения объясняет, как дискриминатор типа может использоваться для достижения исключительности (но не для присутствия) даже при отсутствии отложенных внешних ключей.

Я не уверен, что это ужасно хорошая идея, хотя - менее сдержана, но более простая модель часто считается оправданной компромисс в такой ситуации:

enter image description here

Там нет типа дискриминатора на all - вы можете легко определить, является ли родитель данного типа, проверяя, существует ли соответствующая строка в дочерней таблице. Редко можно проверить тип без также получения данных, специфичных для данного типа, поэтому это вряд ли повлияет на производительность.

Очевидно, что на уровне приложений должно быть выполнено более строгое соблюдение, но это одно из (редких) случаев, когда это считается оправданным из-за простоты и потенциала для лучшей производительности - меньше индексов и, следовательно, меньше обслуживания индекса СУБД должна делать и меньше давления хранения и кеширования.

+0

Спасибо другу, ваш ответ действительно завершен. – Hamidreza

 Смежные вопросы

  • Нет связанных вопросов^_^