Различные типы автомобилей являются примером общей проблемы, которая снова и снова появляется при моделировании данных. Это называется «обобщение / специализация» в моделировании ER и «суперкласс / подкласс» в моделировании объектов.
Специалист по моделированию объектов использует функции наследования, встроенные в объектную модель, для довольно простого решения проблемы. Подклассы просто расширяют суперкласс.
Разработчик реляционных моделей столкнулся с проблемой. Как спроектировать таблицы так, чтобы они подражали преимуществам наследования?
Самый простой метод называется наследованием одной таблицы . Данные обо всех типах автомобилей сгруппированы в единую таблицу для автомобилей. Существует столбец car_type, который группирует все автомобили одного типа. Ни один автомобиль не может принадлежать более чем одному типу. Если столбец не имеет отношения, скажем, к электромобилям, он останется пустым в строках, которые относятся к электромобилям.
Это простое решение хорошо работает для небольших и простых случаев. Наличие большого количества NULL добавляет незначительные издержки к хранилищу и немного к накладным расходам на поиск. Разработчику, возможно, придется изучить трехзначную логику SQL, если булевы тесты выполняются на обнуляемых столбцах. Сначала это может сбить с толку, но к этому привыкаешь.
Существует еще один метод, называемый наследованием таблиц классов . В этом проекте есть отдельные таблицы для gas_car, electric_car и hybrid_car, в дополнение к комбинированной таблице car для всех из них. Когда вы хотите получить все данные об определенном типе автомобиля, вы присоединяете таблицу автомобилей к соответствующей специализированной таблице. В этом дизайне меньше NULL, но вы больше присоединяетесь. Этот метод работает лучше в больших и более сложных случаях.
Существует третий метод, называемый общим первичным ключом. Этот метод часто используется в сочетании с наследованием таблиц классов. Специализированные таблицы для подклассов имеют в качестве своего первичного ключа копию первичного ключа соответствующей записи в таблице автомобилей. Этот столбец идентификатора может быть объявлен как первичным ключом, так и внешним ключом.
Это требует небольшого дополнительного программирования при добавлении новых автомобилей, но это делает соединение простым, легким и быстрым.
Суперклассы и подклассы происходят все время в реальном мире. Не бойся Но проверьте ваш первоначальный дизайн на производительность. Если ваша первая попытка проста и надежна, вы сможете настроить ее, чтобы ускорить ее.