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

例如,如果我们要进行Analytics(分析)记录page_type,item_id,日期,综合浏览量和timeOnPage.

看来,有几种方法可以避免这种情况.有自动的方法吗?

>在唯一标识记录的字段上创建索引,例如[page_type,item_id,date],并使索引唯一,以便在添加相同记录时,它将拒绝它.
>或,如果数据库或框架支持,则将上面的索引设为唯一的主索引.在Rails中,通常ID 1、2、3、4是主要索引.
>或,使用[page_type,item_id,date]查询记录,然后更新该记录(如果该记录已经存在)(如果综合浏览量和timeOnPage已经具有相同的值,则不执行任何操作).如果记录不存在,则使用此数据插入新记录.但是,如果需要以这种方式查询记录,则无论如何我们似乎都需要在这3个字段上建立索引.
>始终插入新记录,但是在查询值时,请使用类似

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

也就是说,获取最新创建的记录,而忽略其余记录.但这似乎是一种针对1条记录的解决方案,但在将值求和(进行汇总)时,如select sum(pageviews)或select count(*),并不可行.

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

解决方法:

您的首选对我来说似乎是可行的.和最简单的方法.默认情况下,Mongo支持此功能.

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

但是看来这在批量插入的情况下是行不通的.如果有任何重复项,则整个批次将失败.快速搜索会显示报告mona bug的现有jiraticket.它仍处于打开状态.

上一篇:XSD到MySQL模式


下一篇:这是MySQL加入吗?