Как реализовать отношения суперкласса, подкласса в базе данных?
Если у меня есть класс животных, то подкласс - это собака и рыба. У животного есть атрибут под названием "цвет". У собаки есть атрибут "длина хвоста", а у рыбы этот атрибут отсутствует. У рыбы есть атрибут "вес", у собаки этот атрибут отсутствует.
Итак, я хочу создать базу данных для хранения этой информации. Что я должен делать? Вот несколько идей:
Идея 1: Создание таблицы для животных и таблицы для типа, чтобы найти, какое животное, если это собака, просто получить результат из таблицы для собак.
Животное: цвет: Строка тип: инт
Тип: Собака:0 Рыба:1
Собака: Хвост Длина: инт
Рыба: Вес: int
Идея 2: Хранить только таблицы собак и рыб в базе данных, убрать таблицы животных.
Собака: Цвет: Стринг Хвост Длина: int
Рыба: Цвет: Стринг Вес: int
3 ответа
Вы упомянули два подхода:
- Одна таблица, представляющая объекты во всей иерархии наследования, со всеми столбцами, необходимыми для всей иерархии, плюс столбец "тип", чтобы указать, какой подкласс является конкретным объектом.
- Одна таблица для каждого конкретного класса в иерархии наследования с дублированной схемой.
может быть дополнено двумя другими:
- Одна таблица для каждого класса в вашей иерархии наследования - теперь у вас есть таблица Animal, а у подклассов есть таблицы с внешними ключами, которые указывают на общий набор данных в Animal.
- Общая схема - иметь таблицу для хранения объектов и таблицу атрибутов для поддержки любого набора атрибутов, прикрепленных к этому объекту.
У каждого подхода есть свои плюсы и минусы. Вот их краткое изложение:
Также взгляните на эти темы SO:
- Что-то вроде наследования в дизайне базы данных
- Помогите мне соединить наследование и реляционные понятия
- Объектно-ориентированные структуры в реляционных базах данных
- Как сделать моделирование наследования в реляционных базах данных?
- Как эффективно моделировать наследование в базе данных?
Наконец, следует отметить, что существуют объектно-ориентированные базы данных (или объектные базы данных, или OODBMS), которые более естественно представляют объекты в базе данных и могут легко решить эту проблему, хотя я не думаю, что они так часто используется в промышленности. Вот некоторые ссылки, которые описывают такие БД по сравнению с реляционными (и другими) БД, хотя они не дадут вам абсолютно объективного (хех) взгляда по этому вопросу:
Вы можете попробовать это так:
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)
Таким образом, вы можете иметь один или несколько атрибутов для каждого животного (выбор за вами).
Используйте однозначное или однозначное отношение. Как вы заметили, в языке разработки схем базы данных таблицы называются класс - подкласс или суперкласс
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)