понимание наследования таблиц классов - PullRequest
3 голосов
/ 23 февраля 2012

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

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

model | name | class_Name
z123  | Abcd | AMPS

Таблица AMPS:

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

Вопрос:

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

Ответы [ 2 ]

4 голосов
/ 23 февраля 2012

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

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

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

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

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

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

4 голосов
/ 23 февраля 2012

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

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

...