Хорошо, я думаю, вам нужно разбить это на основные "разновидности".
У вас есть два объекта в стиле «сущность»:
У вас есть один объект в стиле "сопоставления":
У вас есть один объект "транзакционного" стиля:
Шаг 1: сущность
Давайте начнем с простых: User
& Campaign
. Это действительно два отдельных объекта, и ни один из них не зависит от своего существования. Также между ними нет явной иерархии: пользователи не принадлежат к кампаниям, а кампании не принадлежат пользователям.
Когда у вас есть два таких объекта верхнего уровня, они обычно получают свою собственную коллекцию. Таким образом, вам понадобится коллекция Users
и коллекция Camapaigns
.
Шаг 2: отображение
UserCampaign
в настоящее время используется для представления отображения N-to-M. Теперь, в общем, когда у вас есть отображение N-в-1, вы можете поместить N внутри 1. Однако, с отображением N-в-M, вам обычно приходится «выбирать сторону».
Теоретически вы можете выполнить одно из следующих действий:
- Поместите список
Campaign ID
s внутри каждого User
- Поместите список
Users ID
s внутри каждого Campaign
Лично я бы сделал # 1. Вероятно, у вас гораздо больше пользователей, которые проводят кампании, и вы, вероятно, хотите разместить массив там, где он будет короче.
Шаг 3: транзакционный
Клик - это действительно совершенно другой зверь. В терминах объекта вы можете подумать следующее: Clicks
"принадлежат" a User
, Clicks
"принадлежат" a Campaign
. Таким образом, теоретически, вы можете просто хранить клики, являющиеся частью любого из этих объектов. Легко представить, что клики принадлежат под пользователями или кампаниями.
Но если вы действительно копаете глубже, приведенное выше упрощение действительно ошибочно. В вашей системе Clicks
действительно являются центральным объектом. На самом деле, вы даже можете сказать, что пользователи и кампании действительно просто «связаны» с кликом.
Посмотрите на вопросы / вопросы, которые вы задаете. Все эти вопросы на самом деле сосредоточены вокруг кликов. Пользователи и кампании не являются центральным объектом в ваших данных, клики.
Кроме того, клики будут самыми многочисленными данными в вашей системе. У вас будет гораздо больше кликов, чем что-либо еще.
Это самая большая проблема при разработке схемы для таких данных. Иногда вам нужно оттолкнуть «родительские» объекты, когда они не самая важная вещь. Представьте себе создание простой системы электронной коммерции. Ясно, что orders
будет «принадлежать» users
, но orders
настолько важен для системы, что станет объектом «верхнего уровня».
Завершение
Возможно, вам понадобятся три коллекции:
- Пользователь -> имеет список Campaign._id
- Кампания
- Клики -> содержит user._id, campaign._id
Это должно удовлетворить все ваши запросы:
Просмотр информации от каждого клика, например IP, Referer, OS и т. Д.
db.clicks.find()
Посмотрите, как часто приходят клики от X IP, X Referer, X OS
db.clicks.group()
или запустите Map-Reduce .
Свяжите каждый клик с пользователем и кампанией
db.clicks.find({user_id : blah})
Также можно вставлять идентификаторы кликов как в пользователей, так и в кампании (если это имеет смысл).
Обратите внимание, что если у вас много и много кликов, вам действительно придется анализировать запросы, которые вы выполняете чаще всего. Вы не можете индексировать каждое поле, поэтому вам часто нужно запускать Map-Reduces, чтобы «свернуть» данные для этих запросов.