Если у меня есть класс, названный животным, собака и рыба являются подклассом. У животного есть атрибут, названный "цветом". У собаки есть атрибут, названный "длина хвоста", и у рыб нет этого атрибута. У рыб есть атрибут, названный "весом", собака не имеют этого атрибута.
Так, я хочу разработать базу данных, чтобы хранить эту информацию.Что мне делать? Вот некоторые идеи:
Идея 1: Создание таблицы животных и таблицы имеет тип, для нахождения, какое животное, если это - собака, просто получает результат таблицы собаки.
Животное: color:String type:int
Тип: Dog:0 Fish:1
Собака: TailLength:int
Рыба: Weight:int
Идея 2: Сохраните только таблицу Dog и таблицу Fish в базе данных, удалите таблицу животных.
Собака: Цвет: Строка TailLength: интервал
Рыба: Цвет: Строковый Вес: интервал
Два упомянутых вами подхода:
можно дополнить двумя другими:
У каждого подхода есть свои плюсы и минусы. Вот их хорошее изложение:
Также обратите внимание на эти темы 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)