MongoDB (PHP) - пользовательский "id" и номер OrderWith - PullRequest
3 голосов
/ 02 июня 2011

Сначала скажу, что я новичок в MongoDb и ориентирован на документы в целом.

После некоторых проблем со встроенными документами в mongodb (невозможно выбрать только вложенный документ (например, отдельный комментарий в записи блога)), Я перепроектировал БД. Теперь у меня есть две коллекции, посты и комментарии (не настоящие, использую пример блога для удобства).

Пример - документ коллекции сообщений:

Array {

'_id'   :  MongoId,

'title' : 'Something',

'body'  : 'Something awesome'   

}

Пример - комментарий к документу:

Array {

'_id'    : MongoId,

'postId' : MongoId,

'userId' : MongoId,

'commentId' : 33,

'comment' : 'Punch the punch line!'

}

Как видите, у меня есть несколько документов с комментариями (как я уже говорил, я хочу иметь возможность выбирать один комментарий, а не их массив).

Мой план таков: я хочу выбрать один комментарий из коллекции, используя postId и commentId (commentId является уникальным значением только среди комментариев с одинаковым postId). Да, и commentId должен быть целым числом, чтобы я мог использовать это значение для вычисления следующих и предыдущих документов, своего рода числа "orderWith".

Теперь я могу получить такой комментарий:

URI: mongo.php? Post = 4de526b67cdfa94f0f000000 & comment = 4

Код: $ comment = $ collection-> findOne (массив ("postId" => $ theObjId, "commentId" => (int) $ commentId));

У меня есть несколько вопросов.

  1. Я правильно делаю?
  2. Каков наилучший способ создания подобного комментария?
  3. Каков наилучший способ обеспечить уникальность commentId среди комментариев с одинаковым postId (upsert?)?
  4. Как работать с параллельными запросами?

Ответы [ 2 ]

3 голосов
/ 03 июня 2011

Я правильно делаю?

Это действительно сложный вопрос. Это работает? Удовлетворяет ли он вашим потребностям в производительности, комфортно ли вам его поддерживать?

MongoDB не имеет понятия «нормализация» или «единственно верный путь». Вы моделируете свои данные так, как вам удобно.

Каков наилучший способ создания подобного комментария? Каков наилучший способ обеспечить уникальность commentId среди комментариев с одинаковым postId (upsert?)?

Это действительно сложная проблема. Если вы хотите сгенерировать монотонно увеличивающиеся идентификаторы целых чисел (например, автоинкремент), вам нужен центральный орган для генерации этих целых чисел. Это не очень хорошо масштабируется.

Обычно рекомендуемый метод заключается в использовании ObjectId / MongoId. Это даст вам уникальный идентификатор.

Однако вы действительно хотите целое число. Итак, взгляните на findAndModify . Вы можете сохранить «last_comment_id» в своем сообщении, а затем обновить его при создании нового комментария.

Как работать с параллельными запросами?

Почему одновременные запросы будут проблемой? Два читателя должны иметь доступ к одним и тем же данным.

Вас беспокоит одновременное создание комментариев? Затем посмотрите документацию для поиска изменений.

2 голосов
/ 03 июня 2011

Я не знаю, позволит ли Большая Картина вам это сделать, но вот как я это сделаю.

В каждом посте содержался бы массив комментариев.Это означает, что соединения не нужны.В вашем случае нормализация комментариев не дает никакой пользы.Я бы заменил CommentID на CreatedAt как время создания.

Это позволит вам иметь простую модель данных для работы, а также возможность ее сортировки.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...