Неужели плохая практика имеет несколько взаимоисключающих взаимоотношений «один-к-одному»?

Скажем, таблица car имеет отношение «один к одному» к таблицам electric_car, gas_car и hybrid_car. Если car - electric_car, он больше не может отображаться в gas_car или hybrid_car и т. Д.

Есть ли что-то не так с такой конструкцией? Некоторые проблемы, которые могут возникнуть в будущем?

34 голоса | спросил Arthur Tarasov 18 MonEurope/Moscow2017-12-18T14:45:08+03:00Europe/Moscow12bEurope/MoscowMon, 18 Dec 2017 14:45:08 +0300 2017, 14:45:08

2 ответа


50

Различные типы автомобилей являются примером общей проблемы, которая снова и снова возникает при моделировании данных. Он называется «обобщение /специализация» в моделировании ER и «суперкласс /подкласс» в объектном моделировании.

Объектный модельер использует функции наследования, встроенные в объектную модель, для решения проблемы довольно легко. Подклассы просто расширяют суперкласс.

Реляционный модельер сталкивается с проблемой. как создавать таблицы, чтобы подражать преимуществам, получаемым от наследования?

Самый простой метод называется наследование отдельных таблиц . Данные обо всех типах автомобилей сгруппированы в один стол для автомобилей. Существует столбец car_type, который объединяет все автомобили одного типа. Никакой автомобиль не может принадлежать более чем одному типу. Если столбец не имеет отношения к, скажем, электрическим автомобилям, он останется NULL в ряды, относящиеся к электромобилям.

Это простое решение хорошо работает для небольших и более простых случаев. Присутствие большого количества NULL добавляет крошечный бит к издержкам хранения и немного к издержкам извлечения. Разработчику, возможно, придется изучить трехзначную логику SQL , если логические тесты выполняются на столбцы с нулевым значением. Сначала это может сбить с толку, но к нему привыкают.

Существует еще один метод, называемый наследованием таблицы классов. В этом дизайне есть отдельные таблицы для gas_car, electric_car и hybrid_car, в дополнение к комбинированной таблице, автомобиль, для всех из них. Когда вам нужны все данные о конкретном автомобиле, вы присоединяетесь к автомобильному столику с соответствующей специализированной таблицей. В этом дизайне меньше NULL, но вы больше присоединяетесь. Этот метод работает лучше в более крупных и более сложных случаях.

Существует третий метод, называемый общим первичным ключом. Этот метод часто используется в сочетании с наследованием таблицы классов. Специализированные таблицы для подклассов имеют в качестве основного ключа копию первичного ключа соответствующей записи в таблице автомобилей. Этот столбец id может быть объявлен как первичный ключ, так и внешний ключ.

Это связано с небольшим дополнительным программированием при добавлении новых автомобилей, но делает его простым, легким и быстрым.

Суперклассы и подклассы происходят все время в реальном мире. Не бойся. Но проверьте свой первоначальный дизайн на производительность. Если ваша первая попытка проста и звучит, вы сможете настроить ее, чтобы ускорить ее.

ответил Walter Mitty 18 MonEurope/Moscow2017-12-18T16:32:01+03:00Europe/Moscow12bEurope/MoscowMon, 18 Dec 2017 16:32:01 +0300 2017, 16:32:01
9

Нет ничего плохого в том, что в вашей модели имеется столько подтипов сущностей, сколько необходимо для отражения реальности данных, которые вы пытаетесь моделировать. Вопрос заключается не в том, являются ли подтипы плохой практикой. Проблема может быть хорошей моделью ?

Например, в вашем примере, что вы делаете с чем-то вроде Audi A4 eTron - который является гибридным плагином? Это «электрический автомобиль» или это «гибридный автомобиль»?

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

Подшивка не используется в дизайне базы данных для классификации. Вы можете выполнять классификацию с кодами, внешними ключами для кодовых таблиц или с флагами. Sub-typing используется для моделирования различных наборов предикатов для различных типов вещей, представляющих интерес. Если вы используете подтипы только для классификации, это плохая практика.

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

ответил Joel Brown 18 MonEurope/Moscow2017-12-18T14:57:42+03:00Europe/Moscow12bEurope/MoscowMon, 18 Dec 2017 14:57:42 +0300 2017, 14:57:42

Похожие вопросы

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132