Как реализовать отношения суперкласса, подкласса в базе данных?

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

Итак, я хочу создать базу данных для хранения этой информации. Что мне делать? Вот несколько идей:

Идея 1: При создании стола для животных, а таблица имеет тип, чтобы найти, какое животное, если это собака, просто получить результат от стола собаки.

Животное: цвет: String Тип: INT

Тип: Собака: 0 Рыба: 1

Собака: TailLength: ИНТ

Рыба: Вес: ИНТ

Идея 2: Храните в базе данных только таблицу "Столик" и "Рыбный стол", удалите таблицу животных.

Собака: Цвет: Строка TailLength: int

Рыба: Цвет: Строка Вес: int

Ответ 1

Два упомянутых вами подхода:

  • Одна таблица, представляющая объекты во всей иерархии наследования, со всеми столбцами, которые вам понадобятся для всей иерархии, плюс столбец "type", чтобы сообщить вам, какой подкласс является конкретным объектом.
  • Одна таблица для каждого конкретного класса в вашей иерархии наследования с дублированной схемой.

могут быть дополнены двумя другими:

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

Каждый подход имеет свои плюсы и минусы. Там их можно найти здесь:

Также ознакомьтесь с этими темами SO:

Наконец, следует отметить, что существуют объектно-ориентированные базы данных, которые представляют объекты более естественно в базе данных и могут легко решить эту проблему, хотя они не так часто используются в отрасли. Вот некоторые ссылки, которые описывают такие БД по сравнению с реляционными БД, хотя они не дадут вам совершенно объективного (хех) представления по этому вопросу:

Ответ 2

Вы можете попробовать следующее:

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)

Таким образом, вы можете иметь один или несколько атрибутов для каждого животного (это вам выбрать).

Ответ 3

Использовать одно к нулю или одно отношение. Как вы заметили, в языке проектирования схемы базы данных таблицы называются классами - подклассом или суперклассом

   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)