Расширение классов в базе данных - PullRequest
3 голосов
/ 17 мая 2009

Я работаю над проектом php, который должен хранить информацию о различных зданиях и будет хранить различные типы информации в зависимости от типа здания:

Class Building {
    var $location
    var $name
}

Класс Building будет расширен за счет таких классов, как House и Office, поэтому классы будут выглядеть следующим образом (просто пример)

Class House Extends Building {
    var $numRooms;
    var $numBathrooms;
}

Class Office extends Building {
    var $offices;
    var $sqfoot;
}

Вопрос в том, как это должно быть представлено в базе данных (я использую MySQL, если это имеет значение). Должен ли я использовать строительную таблицу для хранения местоположения и имени, а затем создать таблицу для каждого из других классов для хранения «расширенных» переменных? Или я создаю таблицу для каждого класса? или в таблице построения должны быть столбцы для всех переменных, которые могут быть в других классах?

Ответы [ 2 ]

2 голосов
/ 17 мая 2009

Я настоятельно рекомендую вам взглянуть на шаблон Наследование таблиц классов в соответствии с определением Мартина Фаулера.

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

Я бы порекомендовал вам избегать этого, если у вас нет очень конкретной, четко определенной причины для использования дизайна Entity-Attribute. Во-первых, при использовании этого типа конструкции становится невозможным использовать ограничения в базе данных для контроля того, какие входные данные требуются и какие типы значений допустимы. С другой стороны, это резко замедлит любые запросы, которые должны извлекать данные из этих типов полей, потому что данные, хранящиеся в этих полях, не могут быть проиндексированы, как вы это обычно делаете.

1 голос
/ 17 мая 2009

Если идея состоит в том, чтобы не усложнять ситуацию множеством таблиц и полей, я бы просто создал одну таблицу для Building, а затем добавил два поля для данных, одно из них определило бы тип здания (то есть: дом, офис, и т. д.) другой будет сериализация данных объекта расширенного класса.

Но я думаю, что лучший способ сделать это на самом деле будет зависеть от того, какие запросы вам нужно сделать к базе данных. Например, если вам нужно запросить базу данных, чтобы выбрать все «дома» с «$ numRooms> 5», сериализация может быть не лучшим вариантом ...

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...