Понимание наследования таблиц классов

У меня есть таблица продуктов под названием productsОн имеет 3 поля (имя, модель (PK) и имя_класса). Класс соответствует таблице. Итак, вот пример:

Таблица продуктов:

model | name | class_Name
z123  | Abcd | AMPS

Таблица AMPS:

model | attribute_1 | attribute_2
z123  | blah blah   | blah blah

Вопрос:

Должен ли я иметь таблицу, которая содержит PK (модель) и соответствующее имя класса, а затем использовать идентификатор класса в моей таблице продуктов? Будет ли эффективнее иметь таблицу, содержащую все модели и их классы?

2 ответа

Решение

Это похоже на иерархию "подкласса" (он же "категория"). Если у вас есть и всегда будет только AMPS и никакой другой "дочерний класс", то вы можете рассмотреть возможность объединения его с Product, В остальном это выглядит хорошо.

Кстати, есть 3 способа реализации иерархии классов в реляционных базах данных, каждый из которых имеет свои сильные и слабые стороны. Хранение всех классов в одной таблице является одним из них, но может быть сложным в обслуживании и может быть проблематичным для определенных видов ссылочной целостности. Модель, которую вы уже используете ("класс на таблицу"), вероятно, будет вашим выбором по умолчанию, если нет веских причин, в противном случае...

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

Ваш случай выглядит как пример шаблона проектирования, известного как "специализация обобщения" (Gen-Spec для краткости). Шаблон gen-spec знаком для объектно-ориентированных программистов. Это описано в уроках по обучению наследованию и подклассам.

Дизайн таблиц SQL, которые реализуют шаблон gen-spec, может быть немного сложным. Учебники по дизайну баз данных часто затмевают эту тему. Но это приходит снова и снова на практике.

Если вы будете искать в Интернете "реляционное моделирование специализации обобщения", вы найдете несколько полезных статей, которые научат вас, как это сделать. Вам также несколько раз будет указываться на эту тему на этом форуме.

Как правило, в статьях показано, как спроектировать одну таблицу для сбора всех обобщенных данных и одну специализированную таблицу для каждого подкласса, которая будет содержать все данные, относящиеся к этому подклассу. Интересная часть включает в себя первичный ключ для таблиц подкласса. Вы не будете использовать функцию автонумерации СУБД для заполнения первичного ключа подкласса. Вместо этого вы запрограммируете приложение на распространение значения первичного ключа, полученного для обобщенной таблицы, в соответствующую таблицу подклассов.

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

Другие вопросы по тегам