Выделенный поисковый механизм для работы с динамическими таксономиями - помогает только с производительностью или гибкостью? - PullRequest
8 голосов
/ 17 января 2010

Я некоторое время думал о моделировании типичного сайта электронной коммерции с eBay-подобной таксономией и атрибутами, зависящими от конкретной категории продукта.

Первой попыткой был выбор между EAV и моделированием наследования таблиц для каждого класса. Я выбрал последнее из-за производительности, но это означало создание отдельной таблицы для каждой конкретной категории (лист в дереве категорий) с определенными атрибутами категории (например, разрешение для телевизоров), смоделированными в виде отдельного столбца.

Несмотря на производительность, эта настройка не является гибкой, если вам нужно добавить атрибуты к существующим категориям или добавить новые категории. Для каждого такого изменения необходимо следующее:

  • Изменить / создать таблицу
  • Новая форма для фильтрации по такой категории по определенным атрибутам
  • Новый код для генерации db-запросов для поиска и фильтрации
  • Некоторые новые viewmodels / DTO и представления для представления продуктов из новых категорий

Чтобы справиться с этой сложностью, я думаю, что необходимо какое-то мета-представление этих атрибутов (даже вне приложения) в xml или даже в файле excel, чтобы при каждом изменении весь упомянутый код мог генерироваться автоматически (sql / запросы orm, код приложения, шаблоны). Так что это может помочь в разработке, но все же необходимо тестирование и дополнительное развертывание.

В этот момент я узнал, что ebay на самом деле не использует реляционные БД для поиска, и что их таксономия настолько гибка, что они могут довольно быстро добавлять новые категории листьев. Кроме того, их категории - это, вероятно, не категории из иерархического дерева, смоделированного в реляционной базе данных, а просто атрибуты поиска (фасеты).

После быстрого просмотра наиболее многообещающей специализированной настройки многогранного поиска (отдельного экземпляра Solr) я не уверен, может ли это помочь мне быть гибким к изменениям таксономии, поскольку обычно Solr просто отражает как-то реляционную БД, поэтому конкретные атрибуты категории все еще должны быть смоделированы в БД как метаданные СУБД, например, Динамическое создание форм пользовательского интерфейса для фильтрации атрибутов было бы сложно, если:

1) Я бы сохранял данные в СУБД с использованием EAV fasion и преодолевал проблемы с производительностью с помощью поиска SOLR (но все равно были бы проблемы с беспорядком в EAV, без обеспечения целостности данных и т. Д.)

2) Я бы хранил только словарь атрибутов (т. Е. Только их имена и типы) в СУБД и сохранял значения конкретных атрибутов в SOLR, используя его как хранилище нереляционных данных отдельно от средства поиска. Я также не убежден в этом решении (даже если это возможно), поскольку приложение будет тесно связано с solr (т. Е. Администратор CRUD редакции продукта будет напрямую взаимодействовать с SOLR).

Что ты думаешь? Считаете ли вы, что для любого вида такой (эффективной) таксономии гибкость генерации кода неизбежна? Как бы вы справились с этим? Может быть, какой-то отдельный словарь данных в формате EAV в БД только для целей генерации кода? Думаю, я мог бы также использовать что-то вроде MongoDB, но для генерации кода пользовательского интерфейса (во время выполнения или нет) все равно потребуются какие-то метаданные.

Здесь много вопросов, но я не хотел разбивать их на более мелкие вопросы, поскольку меня интересует общий подход к проектированию при работе с большим классом таких проблем.

Ответы [ 2 ]

2 голосов
/ 17 января 2010

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

  1. Я бы забыл о моделировании этого на RDBMS. Фасетный поиск просто не работает в реляционной схеме .
  2. ИМО, это не подходящее место для генерации кода.Вы должны разработать свой код, чтобы он не менялся при изменении данных (я не говорю об изменениях схема ).
  3. Хранение метаданных / атрибутов в электронной таблице Excel выглядит очень плохоидея.Я бы создал пользовательский интерфейс для редактирования этого, который будет храниться в Solr / MongoDB / CouchDB / независимо от того, что вы выберете для управления этим.
  4. Solr не"просто отражает реляционную БД".На самом деле Solr полностью независим от реляционных баз данных.Одним из наиболее распространенных случаев является выгрузка данных из СУБД в Solr (денормализация данных в процессе), но Solr достаточно гибок, чтобы работать без какого-либо реляционного источника данных.
  5. Иерархическая грань в Solr все еще остается открытой проблемой в исследованиях.В настоящее время исследуются два отдельных подхода ( SOLR-64 , SOLR-792 )
0 голосов
/ 04 июля 2012

Что, если у вас были разные типы категорий для разных типов продуктов?

Например, на eBay у нас будет Продукты , которые могут быть Книги или ТВ / Дисплеи .

Книги имеют название и ISBN, и могут относиться к категории научной фантастики, или к категории эротики, или к категории научной литературы, или к категории автобиографической. Или, может быть, у вас есть книга, которая относится к не художественной, автобиографической эротической категории.

Дисплеи имеют разрешение экрана и потребляемую мощность (?) И могут относиться к категории плоских экранов, категории ЭЛТ или категории HD.

С чисто реляционной точки зрения, вы могли бы возможно смоделировать это так:

[Product]-(1)------(1)-[  Book  ]-(n)------(m)-[ book_category ]
| id    |              | title  |              |  name         |
| price |              | ISBN   |
| ...   |
| ...   |-(1)---(1)-[   display  ]-(n)------(m)-[ display_category ]
                    | resolution |              |  name            |
                    |   watts    |

Вместо моделирования attributes dependent on a particular product category у вас будут разные свойства и категории в зависимости от типа / класса продукта.

См. супертипы и подтипы

...