2014-01-04 5 views
1

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

У меня есть два подхода в виду:

{ 
    _id: "some-random-value-1", 
    query: "this is the query", 
    user: "username-1", 
    date: "query-time-1" 
} 

{ 
    _id: "some-random-value-2", 
    query: "this is the query", 
    user: "username-2", 
    date: "query-time-2" 
} 

и:

{ 
    _id: "some-random-value", 
    query: "this is the query", 
    query-details: [ 
        {user: "username-1", date:"query-time-1"}, 
        {user: "username-2", date:"query-time-2"} 
       ] 
} 

Как вы можете видеть, первый один экономит несколько запросов одного и того же поискового запроса.

Итак, что является лучшим способом из двух (если предположить, есть еще лучше), даже если в будущем, если я хотел детали, как получать количество запросов и т.д.

+0

Конструкции с неограниченным ростом документа не будут работать хорошо во многих базах данных NoSql, включая MongoDb. Документы mongoDb не должны превышать 16 МБ. В то время как это велико, вам нужно подумать о том, что произойдет, когда он попал. Любая структура может работать, если вы не беспокоитесь об этом, вам нужно рассмотреть, какие типы запросов вам понадобятся, и как применять их к вашим структурам. – WiredPrairie

+0

Хорошо. Также я хотел проиндексировать запрос. В случае, если 1 не будет проблемой – shanks

+0

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

ответ

1

На самом деле это зависит от того, как вы собираетесь вставлять/обновлять и запрашивать данные. Не зная об этом, я бы не посмел предложить какое-либо решение, но я могу поделиться некоторыми мыслями, которые могут оказаться полезными.

Прежде всего, я предполагаю, что вы хотите хранить только уникальные запросы для пользователя, поэтому их проще запросить для автозапусков. Если да, то я бы пошел с вашим первым вариантом, добавляя к нему еще более уверенное.

  1. Я всегда UPSERT новую запись запросов пользователя. То есть вставьте его, если он не существует, и обновите поле DATE, если это произойдет. В mongo есть специальная настройка команды, поэтому вам не нужно сначала искать, чтобы проверить, существует ли она или нет.
  2. Я бы создал уникальный индекс для полей пользователя и запроса. Это гарантирует, что комбинация пользовательских запросов будет уникальной, и это будет индекс COVERING для вашего основного запроса, который, я полагаю, является поиском запроса пользователя для возврата поля запроса. Это должно быть очень быстро.
  3. Кроме того, если вы не хотите беспокоить пользователя, предлагая запросы он не использовал долго я хотел бы создать время жить индекс DATE поле так старые запросы удаляются автоматически Монго

Надеюсь, это поможет!

+0

Хорошо. Кроме того, как лучше всего индексировать строку запроса. По-видимому, есть что-то, называемое текстовым индексом, которое помогает, если текстовый поиск включен. Но текстовый поиск не предлагается в производстве – shanks

+0

Ну, не уверен, как выглядит ваша строка запроса, но я действительно сомневаюсь, что вам нужен текстовый индекс, который на самом деле является полнотекстовым индексом. Просто создайте обычный индекс в поле пользователя и запроса, один составной индекс. Этого должно быть более чем достаточно. Функции автоматического отладки обычно выполняют поиск с помощью простого фильтра CONTAINS, поэтому здесь не требуется полный текстовый индекс. –

Смежные вопросы