Как реализовать суперкласс, отношения подкласса в базе данных? - PullRequest
11 голосов
/ 05 июля 2010

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

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

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

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

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

Собака: TailLength: INT

Рыба: Вес: INT

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

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

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

Ответы [ 3 ]

12 голосов
/ 05 июля 2010

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

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

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

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

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

Также взгляните на следующие темы SO:

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

0 голосов
/ 05 июля 2010

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

   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 голосов
/ 05 июля 2010

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

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)

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

...