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

Если у меня есть класс под названием 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)