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

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

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

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

Животное: color:String type:int

Тип: Dog:0 Fish:1

Собака: TailLength:int

Рыба: Weight:int

Идея 2: Сохраните только таблицу Dog и таблицу Fish в базе данных, удалите таблицу животных.

Собака: Цвет: Строка TailLength: интервал

Рыба: Цвет: Строковый Вес: интервал

11
задан Walter Mitty 19 May 2018 в 23:30
поделиться

3 ответа

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

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

можно дополнить двумя другими:

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

У каждого подхода есть свои плюсы и минусы. Вот их хорошее изложение:

Также обратите внимание на эти темы SO:

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

12
ответ дан 3 December 2019 в 09:18
поделиться

Вы можете попробовать это так:

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)

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

0
ответ дан 3 December 2019 в 09:18
поделиться

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

   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)
0
ответ дан 3 December 2019 в 09:18
поделиться
Другие вопросы по тегам:

Похожие вопросы: