Sql – косвенный внешний ключ

У меня есть некоторые вопросы о дизайне базы данных.

  1. Есть ли имя для этого?
  2. Это хорошая практика?
  3. Любые соображения производительности?

У меня есть общая структура таблицы, используемая для хранения отношений.

Недавно я реорганизовал некоторые вещи, чтобы использовать эту общую структуру вместо прямых столбцов Fk, но теперь я не уверен, что это была лучшая идея.

Оригинальная схема:

  + ------------------ + + --------------------- + + ------ ---------------- +
  |  Книга |  |  Примечание.  |  MetaParent |
  | ------------------ |  | --------------------- |  | ---------------------- |
  |  Id |  |  Id |  |  Id |
  |  Примечание |  |  MetaParentId: (Null) |  |  MetaTableId |
  |  + ------- + + ---- + KeyValue |
  |  |  |  |  |  |
  |  |  |  |  |  |
  |  |  |  |  |  |
  |  |  |  |  |  |
  |  |  |  |  |  |
  + ------------------ + + --------------------- + + ------ ---------------- + 

Новая схема

  + ------------------ + + --------------------- + + ------ ---------------- + |  Книга |  |  Примечание.  |  MetaParent |  | ------------------ |  | --------------------- |  | ---------------------- |  |  Id |  |  Id |  |  Id |  |  |  |  MetaParentId: (Null) |  |  MetaTableId |  |  + + + ---- + KeyValue |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  + ------------------ + + --------------------- + + ------ ---------------- + 

Таким образом, в основном вместо прямого отношения Fk между Book и Note у нас есть косвенная связь через таблицу MetaParent с использованием столбцов MetaTableId / KeyValue.

В настоящее время таблица MetaParent имеет около 500 тыс. Записей, и все работает приемлемо. Но мы каждую ночь восстанавливаем индексы.

Мои опасения состоят в том, что отношения между книгой и записью не очевидны. Вы должны знать, что существует, и использовать таблицу MetaParent.

Кроме того, я не уверен, в какой момент мы столкнулись бы с проблемами, при этом работа с MetaTableId / KeyValue будет выполняться слишком медленно. Кажется, чем больше вы добавляете в эту таблицу, тем медленнее будут возникать запросы.

    Вы должны всегда обеспечивать ссылочную целостность, используя «обычные» ИНОСТРАННЫЕ КЛЮЧИ.

    Вкратце, ИНОСТРАННЫЕ КЛЮЧИ имеют следующие преимущества:

    1. Они уже реализованы в СУБД.
    2. Они декларативные , самодокументирующиеся и «очевидные».
    3. Их нельзя обойти (если они явно не отключены или не удалены).
    4. Они верны.
    5. Они быстры.
    6. Они поддерживают каскадные ссылочные действия (например, ON DELETE CASCADE).
    7. СУБД знает, что данные связаны, что позволяет в лучшем случае найти лучший план запроса.
    8. Если вы используете инструмент ORM, он может автоматически создавать ссылки между объектами.

    И вот следующие недостатки обеспечения ссылочной целостности в коде приложения:

    1. Вы дублируете работу, которая уже была выполнена.
    2. Крайне важно , возможно, «зарыться» глубоко в исходный код приложения, и сложнее поддерживать.
    3. Единственное клиентское приложение, которое имеет ошибку, может сломать ссылочную целостность (и испортить данные).
    4. Вероятно, вы неправильно реализуете их в своем коде приложения. Это выглядит просто с самого начала, но в параллельной среде легко ввести условия гонки .
    5. Даже если вы правильно их реализовали, вы, вероятно, использовали некоторую форму блокировки, чтобы избежать условий гонки, которые, вероятно, будут более медленными / менее масштабируемыми, чем специально оптимизированные FK, встроенные в СУБД.
    6. Вы должны реализовать каскадирование себя.
    7. СУБД не знает, какие данные связаны, что может привести к созданию субоптимального плана запроса.
    8. Возможно, вам понадобится сделать больше ручной работы в выбранном вами ORM-инструменте.

    Есть ли имя для этого?

    Не то, что я знаю из. Я слышал, что используется термин «общие FK», но это, вероятно, не универсально.

    Это хорошая практика?

    Нет (см. Выше).

    Любые соображения производительности?

    Да (см. Выше).

    Interesting Posts

    Mac OS X 10.6: клавиша для переключения между выбранной кнопкой в ​​диалоговом окне

    Windows 7 Новый SSD SATA AHCI?

    USB-концентратор, назначающий случайные COM-порты при перезагрузке ПК или USB-концентратора Windows 7

    Как обновить каталог по умолчанию для Windows Command Processor, который будет моим домашним каталогом?

    Как установить псевдоним в командной строке Windows?

    Каков правильный способ убить vncsession в Linux?

    Библиотека поддержки Android v7: ошибка получения родителя для элемента

    Отношение уровней изоляции транзакций с блокировками на столе

    Как переименовать длинные имена файлов в короткие в Linux?

    Почему мои расширения Chrome, возможно, были повреждены?

    Метод ContainArrayList

    Не удается установить pg gem в Mavericks с помощью Postgres.app

    Поделиться закладками между Firefox и Opera

    Цифровой сертификат: как импортировать файл .cer в файл .truststore с помощью?

    Какие селектора CSS3 действительно поддерживают jQuery, например: nth-last-child ()?

    Давайте будем гением компьютера.