2011-06-10 25 views
2

我的Django模型是這樣的:如何在Django ManyToMany模型或MySQL中執行唯一集合?

class Entity(models.Model): 
    name = models.CharField(max_length=40) 
    examples = models.ManyToManyField(Example, blank=True) 
    tokens = models.ManyToManyField(Token, blank=True, null=True) 

我想執行的令牌,即中唯一性,如果已經有與代幣的實體[「A」,「B」,「C」]我不知道想用['a','b','c']添加另一個。然而,帶有標記['a','b','c','d']或['a','b']的實體是不同的集合,應該添加。

如果已找到具有特定集合的實體,我想將已發現的新示例添加到ManyToMany中。舊的名字可以留下。

目前,我運行一個查詢來獲取一個存在的實體,其中有確切的標記集(這本身就是django中的一個挑戰),那麼如果發現我用新的例子更新它。問題在於它在多個服務器上的多個進程中運行,因此在檢查匹配實體是否存在以及是否存在匹配實體之間存在爭用條件,並創建了新匹配。這可能會導致創建具有重複標記集的實體。

我想出的一個解決方案是爲ManyToMany使用顯式貫穿模型,並覆蓋貫穿模型的保存方法以創建令牌集合的散列並將其包含在直通模型本身的列中一個獨特的約束。我認爲這會起作用,但它似乎不是一個特別優雅的解決方案。

我也想象這個問題是在SQL映射表的情況下,在你想要一個唯一集合的情況下有點普遍 - 也許這裏有一個衆所周知的解決方案?我當然願意使用原始的sql。

在此先感謝您的幫助!

+0

我沒有看到一個很好的解決方案,但我不認爲我會得到更多的答覆,所以彼得得到了我作爲唯一受訪者的接受。 – andysk 2011-06-29 00:47:25

回答

2

我不完全確定這種方法可以解決您的問題,但是這裏就是了。

合作的朋友Big保險公司數據庫正在尋找一種基於列的子集在多個數據庫中快速檢測準確數據的方法。我建議採用他正在檢查的一組列,通過某種canonicalifier™運行它們,計算一個MD5摘要,並將其作爲附加索引列保存。 Sucker像潤滑的閃電一樣跑來跑去。

所以,也許你可以做類似的事情。它不能解決你的競爭條件(我想不到的是),但它可以大大簡化重複檢查。

+0

謝謝你的想法,彼得。這正是我正在考慮使用貫穿模型上的散列,覆蓋保存以在貫穿模型上使用散列列以獲得唯一性。我認爲實際上可以通過在散列列上使用完整性約束來解決競爭條件。當然,我不會真正強制數據是一個獨特的集合,但如果這是我訪問它的唯一方式(它是),那麼我可以確保哈希與ManyToMany保持一致。仍然看起來不像是優雅的解決方案,但也許它是一樣的好 – andysk 2011-06-10 11:32:48

相關問題