Разработка базы данных Nosql - MongoDB - PullRequest
0 голосов
/ 10 ноября 2019

Я пытаюсь создать приложение, в котором у меня есть только эти 3 модели:

  • тема (имеет только заголовок (макс. 100 символов))
  • комментарий (имеет текст (может быть очень длинным), author_id , topic_id , createDate )
  • author(имеет только имя пользователя )

На самом деле очень простая структура БД. В теме может быть много комментариев, созданных авторами. И у автора может быть много комментариев.

Я все еще пытаюсь найти лучший способ проектирования структуры базы данных (документов). Сначала я хотел бы поставить все на свою схему, как указано выше. 3 документа. Но так как это nosql db, я должен попытаться устранить необходимость в объединении. И теперь я действительно думаю о том, чтобы поместить все в один документ, что также звучит безумно.

Это мои собственные запросы от пользовательского интерфейса:

  • Запрос домашней страницы: Список всехТемы, которые получили наибольшее количество комментариев сегодня (будет работать очень часто)
  • Автоматический список предложений для поля поиска: Список всех тем, в названии которых есть строка "X"
  • Главная страница запроса к теме: Список всех комментариев к теме с именем пользователя их авторов.

Поскольку большинству моих запросов нужны данные изпо крайней мере, 2 документа, если я действительно просто использую их все вместе в одном документе, например:

Комментарий ( текст , имя пользователя , topic_title , createDate )

Таким образом, мне не нужно будет объединяться, но и сохранять, т. Е. Заголовок тем несколько раз .. в каждом комментарии ..

Я простоне могу решить.

Я ценю любую помощь.

Ответы [ 2 ]

0 голосов
/ 11 ноября 2019

Пересмотренный дизайн:

Три запроса (в посте с вопросом), вероятно, будут такими (псевдокод):

  • выберите все темы из комментариев, где датасегодня, группировка по теме и подсчет комментариев, упорядочение по количеству (desc)
  • выбор тем из комментариев, где тема соответствует поиску, группировка по теме.
  • выбор всех из комментариев, где тема соответствуетtopic_param, упорядочить по comment_date (desc).

Итак, как вы и предполагали (в своем посте с вопросом), вероятно, будет одна основная коллекция, comments.

комментарии:

  date
  author
  text
  topic

Пользовательские и тематические коллекции с одним полем, необязательно, для сохранения уникальности.

Обратите внимание на группу-по запросам будут запросы агрегации, например, основной запрос будет выглядеть так:

db.comments.aggregate( [
  { $match: { date: ISODate("2019-11-15") } },
  { $group: { _id: "$topic", count: { $sum: 1 } } },
  { $sort: { count: -1 } }
] )

Это даст вам имена всех тем, на сегодняшний день и с наибольшим количеством тем.

0 голосов
/ 10 ноября 2019

Вы можете сделать второй дизайн, который вы предложили, но все сводится к тому, как вы хотите использовать данные. Я предполагаю, что вы собираетесь использовать его для веб-сайта.

Если вы хотите, чтобы комментарии были кликабельными, например, при нажатии на название темы вы будете перенаправлены на страницу темы или при нажатии на имя пользователя будет перенаправлен наНа странице пользователя, где вы можете увидеть все его комментарии, я предлагаю вам сохранить их в качестве идентификаторов. Поскольку позже вы можете использовать .populate(“field1 field2”) и можете выбрать поля, которые вы хотели бы получить из этого идентификатора.

В качестве альтернативы вы можете хранить и theme_name, и username, и их идентификаторы в одном документе, чтобы уменьшить количество запросов, нов конечном итоге вы будете хранить больше избыточных данных.

...