Скажем, у меня следующий дизайн:
id | participant_ids
...| [ObjectId(...), ObjectId(...)]
Теперь я запрашиваю его следующим образом:
db.events.find({
participant_ids: ObjectId(...)
});
Что идентично этому:
db.events.find({
participant_ids: {
$in: ObjectId(...)
}
});
Я полагаю, что между этими двумя показателями нет различий в производительности (но поправьте меня, если я ошибаюсь!).
Для каждого события есть как минимум 1 и максимум 2участников.Поэтому я мог бы также использовать следующий дизайн:
id | participant_1_id | participant_2_id
... и запросить его следующим образом ...:
db.events.find({
$or: {
participant_1_id: ObjectId(...),
participant_2_id: ObjectId(...)
}
});
Если бы я не использовал индексирование,это, вероятно, не имеет большого значения, но, конечно же, я.
Для первого дизайна я бы пошел со следующим индексом:
db.events.ensureIndex({
participant_ids: 1
});
Для второгоВо-первых, я пойду с этим:
db.events.ensureIndex({
participant_1_id: 1,
participant_2_id: 1
});
У обоих есть недостатки, когда вы смотрите на их производительность.
- 1-й запрос: Использование
Array
, вероятно, медленнее, чем использование простого ключа. - 2-й запрос: Использование оператора
$or
не очень быстрое. - 2-й запрос: Не очень масштабируемый, скажем, я бы хотел когда-нибудь освободить лимит участников, это было бы невозможно (у вас было бы неограниченное количество ключей и неограниченное количество элементов в
$or
частивопросы).
Мои вопросы: - Какой дизайн я должен использовать?- Могу ли я индексировать Array
с?Документы ничего не говорят об этом, и я не уверен, что Array
s (поскольку их содержание может сильно отличаться).