如何避免在MongoDB(使用Mongoid)或ActiveRecord(使用MySQL的Rails)中插入两次相同的记录?

时间:2010-09-15 02:34:19

标签: sql mysql mongodb rdbms mongoid

例如,如果我们正在使用Google Analytics记录page_type,item_id,日期,综合浏览量,timeOnPage。

似乎有几种方法可以避免它。有自动方式吗?

  1. 在唯一标识记录的字段上创建索引,例如[page_type, item_id, date]并使索引唯一,这样在添加相同记录时,它将拒绝它。

  2. 或者,如果数据库或框架支持,则使上面的主索引是唯一的。在Rails中,通常ID 1,2,3,4是主要索引。

  3. 或使用[page_type, item_id, date]查询记录,然后更新该记录(如果已存在)(或者如果pageviews和timeOnPage已经具有相同的值,则不执行任何操作)。如果记录不存在,则插入包含此数据的新记录。但是如果需要以这种方式查询记录,看起来我们还需要这3个字段的索引。

  4. 始终插入新记录,但在查询值时,请使用

    之类的内容
    select * from analytics  where ...  order by created_at desc limit 1
    
  5. 即获取最新创建的记录并忽略其余记录。但这似乎是1条记录的解决方案,但在汇总值(进行聚合)时却不太可行,例如select sum(pageviews)select count(*)

    除了使用上述方法之外,还有一些自动解决方案吗?

2 个答案:

答案 0 :(得分:4)

你的第一个选择似乎对我有用。最简单的方法。 Mongo默认支持此功能。

在插入时,它将检查唯一组合,如果存在,它将忽略插入并在服务器日志中写入“E11000重复键错误索引”消息。否则它将继续正常插入。

但似乎这在批量插入的情况下不起作用。如果有任何重复,整个批次将失败。快速谷歌搜索显示现有的mongo bug报告jira ticket。它还是开放的。

答案 1 :(得分:1)

我不能代表Mongoid / MongoDB,但是如果你想在关系数据库中强制执行唯一性约束,你应该创建一个uniqueness constraint。这就是他们的目的!在MySQL中,这相当于一个唯一索引;您可以将其指定为CONSTRAINT ... UNIQUE (col1, col2),但无论如何这只会创建一个唯一的索引。