Кошерная структура базы данных сайта объявлений?

Добрый день.

Хочу сделать доску объявлений так как не смог найти достойных скриптов в инете. (может кто-то знает качественный скрипт?) Требуется функционал поиска и фильтров как в irr.ru и avito.ru, тоесть каждая категория может иметь свои поля, по которым можно фильтровать поиск.
Поля соответственно могут быть различных типов: text, select, checkbox, radiobutton с множественным выбором, year, date, coordinates и "select, зависящий от другого select-а" (например выбираем город и появляется список районов этого города, или выбираем марку машины, появляется список моделей этой марки).

Пока структура базы данных представляется так:
f0ee091005.jpg
Таблица field_selectable_value_category осуществляет зависимость между "зависимыми select-ами".

Возможные действия с базой на сайте:
1) админка:
- создать/редактировать/удалить объявление
- создать/редактировать/удалить категорию
- создать/редактировать/удалить поле
- отобразить поля определенной категории
- отобразить объявления определенной категории
- отобразить дерево зависимых select-ов
- отобразить дерево категорий
2) личный кабинет:
- отобразить объявления со всеми полями
- создать/редактировать/удалить объявление
- отобразить дерево категорий
3) фронтенд:
- отобразить объявления определенной категории
- одновременный поиск по тексту объявления, фильтр по полям и сортировка по цене, тексту, дате
- отобразить поля определенной категории
- отобразить дерево категорий
- отобразить объявления со всеми полями

Получается, чтобы отфильтровать объявления, надо сделать join объявлений, категорий и фильтруемых полей, которых может быть 5-10. Более того, надо в это же время искать поисковую фразу по тексту объявления.
Одна из идей - при создании/редактировании объявления заполнять дополнительное поле text_cache фразой состоящей из текста объявления и списка полей, например "текст объявления; field_1: mercedes, field_2: 2007", и производить поиск по данному полю. Данный способ также хорош тем, что если человек вводит поисковую фразу "mercedes 2007" логично отобразить ему объявления с полями: марка - mercedes, год создания - 2007, а не только искать эту фразу в тексте самого объявления.
Кроме того, не могу решить где наилучшим образом хранить данные, можно например таблицы field, category... хранить в mysql, а сами объявления со всеми их данными - в mongodb, тогда когда нужно будет отфильтровать объявления, не нужно будет делать join по множеству полей, а просто выбрать нужную запись со всеми данными. Но я не уверен, что в mongodb есть полнотекстовый поиск, сравнимый со sphinx, elasticsearch или solr, поэтому возможно придется подключить еще и поисковый движок. (кто-то может сказать точно, есть ли в mongodb хороший полнотекстовый поиск?)

Вообщем и целом советы и исправления приветствуются.
  • Вопрос задан
  • 3728 просмотров
Пригласить эксперта
Ответы на вопрос 1
@asdz
А где в этой структуре хранятся возможные значения свойств списков, флажков?
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы