Многоуровневое отображение наследования с доктриной 2

У меня есть три объекта, которые являются адресными (могут иметь адрес):

Точки доставки
Клиенты
Центры распространения

Каждый адресуемый объект также является геолокационным (имеет широту и долготу), но у меня есть объекты, которые геолокационны, но не геолокационны, например Точки отслеживания и Точки маршрута (упорядоченная последовательность широты и долготы).

Каков наилучший способ (пожалуйста, примите во внимание производительность, поскольку некоторые таблицы могут иметь миллионы строк) для достижения этого с помощью доктрины 2 (используя сопоставление Symfony2 и YAML)?

Мой вопрос: каков наилучший подход к этой проблеме? сопоставленные супперклассы? наследование одной таблицы? многотабличное наследование? Я не понял, какой из них лучше всего подходит для этого, прочитав документы доктрины.

Я использую PostgreSQL, если это имеет значение.


comment
в чем именно ваш вопрос? как вообще наследовать сопоставление несколько раз? наследование через сопоставленные суперклассы? почему вы включили тег single-table-inheritance? различия наследования нескольких таблиц и наследования одной таблицы?   -  person Nicolai Fröhlich    schedule 18.07.2013
comment
@nifr Мой вопрос: как лучше всего решить эту проблему, сопоставление супперклассов? один стол? мультистол? Я не понял, какой из них лучше всего подходит для этого, прочитав документы доктрины.   -  person Felipe Zavan    schedule 18.07.2013


Ответы (2)


Самым быстрым вариантом было бы вообще не использовать какое-либо наследование таблиц и сопоставлять все объекты с отдельными таблицами, но если вы по какой-то причине хотите использовать наследование таблиц...

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

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

Реальный прирост производительности достигается за счет оптимизации ваших запросов и кэширования их и их результатов.

person Nicolai Fröhlich    schedule 18.07.2013
comment
Спасибо. Мне очень хочется просто сопоставить все объекты с отдельными таблицами для производительности, масштабируемости (я могу изменить их по отдельности) и по причинам простоты, но я собираюсь немного подождать, если у кого-то есть действительно хорошая идея. - person Felipe Zavan; 18.07.2013
comment
Это то, что я бы сделал ... упрощает обслуживание / настройку, и это самый быстрый вариант. Я почти уверен, что здесь никто не даст сложного ответа, но я был бы рад ошибиться ... помните, что преждевременная оптимизация - это корень всех зол - person Nicolai Fröhlich; 18.07.2013

Это определенно та ситуация, когда композиция подходит лучше, чем наследование.

Язык, который вы используете для описания проблемы, поучителен. Вы определяете «Адресуемый» как «может иметь и Адрес, который отличается от «Клиент — это тип адреса». В последнем случае наследование имеет больше смысла. .

Нулевой уровень — это просто использование ассоциаций (адрес геолокации OneToOne, адрес клиента OneToOne, геолокация RoutePoint OneToOne) и т. д.).

Если вы хотите выполнить набор операций над чем-либо, имеющим адрес, создайте интерфейс с именем Addressable и попросите вашего клиента реализовать его.

Если вы используете PHP 5.4, вы можете использовать трейты для реализации этих интерфейсов.

person timdev    schedule 19.07.2013