2010-09-15 61 views
3

例如,如果我們在Google Analytics中記錄page_type,item_id,date,pageviews,timeOnPage。如何避免在MongoDB(使用Mongoid)或ActiveRecord(使用MySQL的Rails)中插入兩次相同的記錄?

看來他們有幾種方法可以避免它。有沒有一種自動方式?

  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 
    

也就是說,獲得最新創建的記錄而忽略其他。但是,這似乎是1條記錄的解決方案,但在彙總數值(彙總)時不太可行,例如select sum(pageviews)select count(*)

除了使用上面的方法還有一些自動解決方案嗎?

回答

1

我不能說Mongoid/MongoDB,但如果你想強制關係數據庫中的唯一性約束,你應該創建一個uniqueness constraint。這就是他們在那裏!在MySQL中,這相當於一個唯一的索引;你可能指定它爲CONSTRAINT ... UNIQUE (col1, col2),但這隻會創建一個唯一的索引。

4

建,

你的第一選擇似乎可行的給我。最簡單的方法。 Mongo默認支持此功能。

插入時會檢查唯一的組合,如果存在,它將忽略插入並在服務器日誌中寫入「E11000重複密鑰錯誤索引」消息。否則,它將繼續正常插入。

但似乎這不適用於批量插入的情況。如果有任何重複,整批將失敗。快速的谷歌搜索會顯示現有的mongo bug報告jira ticket。它仍然開放。

相關問題