Методы для наследования базы данных? - PullRequest
31 голосов
/ 22 декабря 2008

Каковы советы / методы, когда вам нужно сохранить классы с наследованием в реляционной базе данных, которая не поддерживает наследование?

Скажите, у меня есть классический пример:

Person -> Employee -> Manager
                   -> Team lead
                   -> Developer
       -> Customer -> PrivilegedCustomer
                   -> EnterpriseCustomer

Какие существуют методы для проектирования базы данных? Плюсы и минусы каждого?

p.s. Я искал и нашел несколько вопросов, касающихся наследования базы данных, но большинство было о переходе на ядро ​​базы данных, которое поддерживает его изначально. Но скажем, я застрял с SQL Server 2005 ... какие у меня варианты?

Ответы [ 3 ]

27 голосов
/ 22 декабря 2008

Три общие стратегии:

  1. Создайте таблицу для каждого класса в иерархии, содержащую свойства, определенные для каждого класса, и внешний ключ обратно в таблицу суперкласса верхнего уровня. Таким образом, у вас может быть таблица vehicle с другими таблицами, такими как car и airplane, которые имеют столбец vehicle_id. Недостатком здесь является то, что вам может потребоваться выполнить много соединений только для того, чтобы получить один тип класса.

  2. Создайте таблицу для каждого класса в иерархии, которая содержит все свойства. Это может быть сложно, так как сложно поддерживать общий идентификатор для всех таблиц, если вы не используете что-то вроде последовательности. Запрос для типа суперкласса потребует объединений для всех рассматриваемых таблиц.

  3. Создать одну таблицу для всей иерархии классов. Это исключает объединения и объединения, но требует, чтобы все столбцы для всех свойств класса были в одной таблице. Вероятно, вам придется оставить большинство столбцов обнуляемыми, поскольку некоторые столбцы не будут применяться к записям другого типа. Например, таблица vehicle может содержать столбец с именем wingspan, который соответствует типу Airplane. Если вы сделаете этот столбец NOT NULL, то для любого экземпляра Car, вставленного в таблицу, потребуется значение для wingspan, даже если значение NULL может иметь больше смысла. Если вы оставите столбец обнуляемым, вы можете обойти это с проверочными ограничениями, но это может стать уродливым. ( Наследование одной таблицы )

6 голосов
/ 19 октября 2011

Будьте осторожны с наследованием базы данных в определенных ситуациях - мы внедрили его в наше приложение для нашей стратегии аудита, и в итоге мы столкнулись с проблемой узкого места / кошмара производительности.

Проблема заключалась в том, что используемая нами базовая таблица была только для вставки и быстро менялась, так что в итоге мы получили тупики все по всему месту. В настоящее время мы планируем разбить их на отдельные таблицы, потому что головная боль, связанная с наличием одинаковых столбцов в 15 разных таблицах, в сравнении с кошмаром производительности, того стоит. Это также усугублялось тем фактом, что структура сущностей не обязательно эффективно обрабатывает наследование (это известная проблема Microsoft).

В любом случае, я подумала, что поделюсь некоторыми знаниями, так как мы прошли через эту проблему.

5 голосов
/ 22 декабря 2008

Глава 8. Карта наследования в следующей ссылке также обсуждала это. http://nhibernate.info/doc/nh/en/index.html#inheritance

Это документ NHibernate.

...