Как реализовать отношения суперкласса и подкласса в базе данных?
Если у меня есть класс под названием animal, dog and fish является подклассом. У животного есть атрибут, называемый "цвет". У собаки есть атрибут, называемый "длина хвоста", а у рыбы нет этого атрибута. У Рыб есть атрибут, называемый "вес", у собаки нет этого атрибута.
Итак, я хочу создать базу данных для хранения этой информации. Что мне делать? Вот некоторые идеи:
Идея 1: Создание таблицы животных, а таблица имеет тип, чтобы найти какое животное, если это собака, просто получите результат от dog table.
животные: цвет: строка тип:int
тип: Собака:0 Рыбы:1
собака: TailLength:инт
рыба: Вес:инт
Идея 2: Храните только таблицу собак и таблицу Рыб в базе данных, удалите таблицу животных.
собака: Цвет: Строка TailLength: инт
рыба: Цвет: Строка Вес: инт
3 ответов
два подхода, которые вы упомянули:
- одна таблица, представляющая объекты во всей иерархии наследования, со всеми столбцами, которые вам понадобятся для всей иерархии, плюс столбец "тип", чтобы сообщить вам, какой подкласс является конкретным объектом.
- один стол для каждого б класс в иерархии наследования с дублированной схемой.
могут быть дополнены двумя другими:
- одна таблица для каждого класса в вашей иерархии наследования – теперь у вас есть животные таблица, и подклассы есть таблицы с внешними ключами, которые указывают на общий набор данных в животные.
- общая схема - есть таблица для хранения объектов и таблица атрибутов для поддержки любого набора атрибутов, прикрепленных к этому объекту.
каждый подход имеет плюсы и минусы. Их там много. здесь:
также взгляните на эти темы SO:
- что-то вроде наследования в дизайне базы данных
- помогите мне соединить наследование и реляционные понятия
- объектно-ориентированные структуры в реляционных базах данных
- как сделать Моделирование наследования в реляционных базах данных?
- как эффективно моделировать наследование в базе данных?
наконец, следует отметить, что есть объектно-ориентированные базы данных (он же объектные базы данных или OODBMSes), которые представляют объекты более естественно в базе данных и могут легко решить эту проблему, хотя я не думаю, что они так часто используются в отрасли. Вот некоторые ссылки, которые описывают такие DBs по сравнению с реляционными (и другими) DBs, хотя они не дадут вам полностью цель (хех) взгляд на этот вопрос:
вы можете попробовать это так:
Animal
PK animal_id
FK animal_type
STRING animal_name (eg. 'Lassie')
AnimalTypes
PK animal_type
STRING animal_type_name (eg. 'Dog')
AnimalAttributes
PK attribute_id
STRING attribute_name (eg. 'tail length')
AnimalToAttributes
PK id
FK animal_id
FK attribute_id
INTEGER value (eg. 20)
таким образом, вы можете иметь один или несколько атрибутов на животное (это зависит от вас).
используйте отношение от единицы до нуля или одно, как вы заметили, на языке разработки схемы базы данных таблицы называются class - sub-class или superclass
Create Table Animal
(animalId Integer Primary Key Not null,
Other columns generic to all animals)
Create Table Birds
(BirdId Integer Primary Key Not Null
references Animal(AnimalId),
-- other columns)