设计表的更好方法

时间:2014-01-04 10:45:54

标签: mongodb database-design indexing

我正在设计一个数据库表,用于存储用户搜索的所有查询(以便我可以将其用于自动建议)。此外,我想存储搜索它的数据以及查询发生的时间。

我有两种方法:

{
  _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"}
                 ]
}

如您所见,第一个保存了同一搜索查询的多个查询。

所以,这是两者中较好的方法(建议如果有更好的方法),即使将来我想要获取查询计数等详细信息等。

1 个答案:

答案 0 :(得分:1)

实际上,这取决于您要如何插入/更新和查询数据。在不知情的情况下,我不敢提出任何解决方案,但我可能会分享一些您可能会发现有用的想法。

首先,我假设您希望每个用户只存储唯一的查询,因此更容易查询它们以进行自我提示。如果是的话,我会基本上选择你的第一个选项添加一些更确定的。

  1. 我总是 UPSERT 一个新的查询用户条目。如果它不存在则插入它并更新 DATE 字段。在mongo中有一个特殊的命令设置,所以你不必先搜索它是否存在。
  2. 我会在用户和查询字段上创建一个唯一索引。这将确保用户查询组合是唯一的,它将是您的主查询的 COVERING 索引,我想这是用户查询搜索返回查询字段。这应该非常快。
  3. 此外,如果您不想通过建议他长时间不使用的查询来打扰用户,我会在 DATE 字段中创建生存时间索引,以便mongo
  4. 会自动删除旧查询

    希望它有所帮助!