Для кода выше...//* [содержит (@prop, 'нечто')]
Я думаю, что идеального решения не существует - зависит от того, какие операции более важны для вашего приложения. Я считаю, что Silicon Alley Insider хранит комментарии, вложенные, например, в MongoDB. Это усложняет вопрос, о котором вы говорите.
Один из вариантов - хранить на верхнем уровне сообщения список всех комментаторов в массиве. Думайте об этом как об денормализованных данных. Тогда можно будет легко найти все сообщения, в которых участвует определенный комментатор. Затем для детализации вы используете map / reduce или db.eval (), чтобы получить информацию о вложенном посте внутри.
Еще одно замечание - если вы имеете дело с одним документом, db.eval (), вероятно, легче чем карта / уменьшить. $ where также является вариантом, но может быть медленным, поэтому мне нравится упомянутый выше дополнительный «список комментаторов» - не так просто индексировать этот массив (см. «Multikey» в документации).
См. также:
Еще одно замечание: если вы имеете дело с одним документом, db.eval (), вероятно, легче, чем map / reduce. $ where также является вариантом, но может быть медленным, поэтому мне нравится упомянутый выше дополнительный «список комментаторов» - не так просто индексировать этот массив (см. «Multikey» в документации).
См. также:
Еще одно замечание: если вы имеете дело с одним документом, db.eval (), вероятно, легче, чем map / reduce. $ where также является вариантом, но может быть медленным, поэтому мне нравится упомянутый выше дополнительный «список комментаторов» - не так просто индексировать этот массив (см. «Multikey» в документации).
См. также: люди, которые видят их в ленте новостей). Вы можете получить много сообщений на событие, но это сделает запросы к интерфейсу намного быстрее и переложит работу на фоновые процессы.
Я не использовал Gearman, но если это что-то вроде вещь, которая позволяет загружать среду вашего приложения в фоновом режиме и получать события для обработки через очередь, тогда это, вероятно, хорошая идея.
Мое простое решение состояло в том, чтобы свернуть свою собственную, используя beanstalkd и мои собственные скрипты PHP.
Facebook разработал собственную базу данных для такого рода вещей и открыл ее исходный код, я мало что об этом знаю, но полагаю, что стоит посмотреть .
Это похоже на то, что можно решить с помощью правильного индекса. Я бы построил решение на основе предположения, что база данных способна с этим справиться, но разместил бы службу перед базой данных и позволил бы всем клиентам пройти через этот момент. Если что-то пойдет слишком медленно, вы можете ввести различные типы кэширования на этом уровне. Как и в случае с большинством решений о производительности, попытка сделать это сразу, вероятно, не лучшая идея.
Не знаю, как структурирована ваша БД (возможно, вы захотите рассказать нам больше), но что-то очевидное, например
SELECT events.* FROM events, event_tags, user_tags
WHERE event_tags.event_id = events.id
AND event_tags.tag_id = user_tags.tag_id
AND user_tags.user_id = <$user_id>
, мне не кажется слишком сложным, если у вас есть все индексы над местом
Вы смотрели модуль Activity ? Вот отрывок со страницы проекта:
... отслеживает, что люди делают на вашем сайте, и предоставляет мини-каналы об этих действиях в блоках, в специальной таблице и через RSS. Модуль является расширяемым, так что любой другой модуль может интегрироваться с ним. Создаваемые сообщения настраиваются через интерфейс администратора и зависят от контекста.
Мне будет любопытно, что вы придумаете, потому что в ближайшем будущем нужно будет сделать что-то подобное.