Я еще не готов отпустить это, поэтому я передумал проблему и отредактировал Q (оригинал ниже).
Я использую mongoDB для проекта на выходные, и для этого требуются некоторые отношения в БД, в чем все это страдание:
У меня есть три коллекции:
Users
Lists
Texts
Пользователь может иметь тексты и списки - списки, содержащие "тексты". Тексты могут быть в нескольких списках.
Я решил пойти с отдельными коллекциями (не встраивается), потому что дочерние документы не всегда отображаются в контексте их родителя (например, все тексты, не входя в список).
Итак, что нужно сделать, это ссылки на тексты, которые входят в определенные списки именно с этими списками. Могут быть неограниченные списки и тексты, хотя списки будут меньше в сравнении.
В отличие от того, о чем я впервые думал, я мог бы также поместить ссылку в каждый текстовый документ, а не все текстовые идентификаторы в списке-документы. Это на самом деле повлияет, потому что я могу уйти с одним запросом, чтобы найти каждый фрагмент в списке. Может даже индексировать эту ссылку.
var TextSchema = new Schema({
_id: Number,
name: String,
inListID: { type : Array , "default" : [] },
[...]
Также редко бывает, что тексты будут в МНОГИХ списках, поэтому массив не будет взрываться. Вопрос типа остается, хотя, есть шанс, что это масштабы или на самом деле лучший способ реализовать его с помощью mongoDB? Помогло бы ли это ограничить количество списков, текст которых может быть (возможно)? Есть ли рецепт для нескольких: много отношений?
Было бы здорово получить ссылки на проекты, где это было сделано и как оно было реализовано (несколько: многие отношения). Я не могу поверить, что все уклоняются от БД монго, как только нужны некоторые отношения.
Оригинальный вопрос
Я сломаю его в двух проблемах, которые я вижу до сих пор: 1) Предположим, что список состоит из 5 текстов. Как я могу ссылаться на тексты, содержащиеся в списке? Просто откройте массив и сохраните там текст _ids? Похоже, эти массивы могут вырасти до луны и назад, замедляя приложение? С другой стороны, тексты должны быть доступны без списка, поэтому внедрение не является вариантом. Что делать, если я хочу получить все тексты списка, содержащего 100 текстов.. звучит как два запроса и массив со 100 полями: -/. Таким образом, этот способ ссылки на правильный способ сделать это?
var ListSchema = new Schema({
_id: Number,
name: String,
textids: { type : Array , "default" : [] },
[...]
Проблема 2) Я вижу, что при таком подходе очистка ссылок, если текст удаляется. Его ссылка будет по-прежнему в каждом списке, который содержит текст, и я бы не захотел повторить все списки, чтобы очистить эти мертвые ссылки. Или я? Есть ли разумный способ решить эту проблему? Просто, чтобы тексты содержали ссылку (в каком списке они), просто перемещает проблему вокруг, так что не вариант.
Я думаю, что я не первый из таких проблем, но я также не смог найти окончательный ответ о том, как сделать это "правильно".
Мне также интересны общие мысли о наилучшей практике для такого рода ссылок (многие-ко многим?) и особенно масштабируемости/производительности.