2010-07-05 2 views
11

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

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

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

животных: цвет: String Тип: INT

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

Dog: TailLength: Int

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

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

Dog: Цвет: String TailLength: INT

Рыба: Цвет: String Вес: ИНТ

ответ

12

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

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

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

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

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

Также посмотрите на эти С.О. темы:

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

+0

1-я ссылка oo в конце удаляется. – philipxy

0

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

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

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

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) 
Смежные вопросы