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

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

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

Идея 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)
Другие вопросы по тегам