代码之家  ›  专栏  ›  技术社区  ›  nonopolarity

如何避免在mongodb(使用mongoid)或activerecord(rails使用mysql)中插入同一条记录两次?

  •  3
  • nonopolarity  · 技术社区  · 14 年前

    例如,如果我们正在进行分析,记录页面类型、项目ID、日期、页面视图、TimeOnPage。

    似乎有几种方法可以避免这种情况。有自动的方法吗?

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

    2. 或者,如果数据库或框架支持上述索引,则将其作为唯一的主索引。不过,在rails中,通常id 1、2、3、4是主要索引。

    3. 或者,使用 [页面类型,项目ID,日期] ,然后更新该记录(如果pageviews和timeonpage已经具有相同的值,则不执行任何操作)。如果记录不存在,则插入包含此数据的新记录。但如果需要这样查询记录,我们似乎无论如何都需要这3个字段的索引。

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

      select * from analytics  where ...  order by created_at desc limit 1
      

    也就是说,获取最新创建的记录并忽略其余的记录。但这似乎是一个针对1个记录的解决方案,但在对值进行汇总(进行聚合)时不太可行,例如 select sum(pageviews) select count(*) .

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

    2 回复  |  直到 14 年前
        1
  •  4
  •   RameshVel    14 年前

    Jian

    你的第一个选择在我看来是可行的。最简单的方法。Mongo默认支持此功能。

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

    但这似乎不适用于批量插入。如果有任何重复,则整个批将失败。快速搜索显示现有的Mongo Bug报告Jira ticket . 它还开着。

        2
  •  1
  •   wuputah    14 年前

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