2011-01-25 150 views
7

我已經在我的數據存儲一些重複的元素(不整列,但大多數字段就可以了)在App Engine中。查找App Engine數據存儲重複

什麼是找到他們的最佳方式?

我已經是重複的整數和字符串字段(如果比較一個比其他快)。

謝謝!

回答

6

一個愚蠢但快速的方法將採取你關心的領域,連接他們作爲一個長字符串,並將它們存儲爲引用原始實體的實體的關鍵。每次你做DB_Unique.get_or_insert()你應該驗證參考是否是正確的原始實體,否則,你有一個副本。這應該可以在map reduce中完成。

喜歡的東西:

class DB_Unique(db.Model): 
    r = db.ReferenceProperty() 

class DB_Obj(db.Model): 
    a = db.IntegerProperty() 
    b = db.StringProperty() 
    c = db.StringProperty() 

# executed for each DB_Obj... 
def mapreduce(entity): 
    key = '%s_%s_%s' % (entity.a,entity.b,entity.c) 
    res = DB_Unique.get_or_insert(key, r=entity) 
    if DB_Unique.r.get_value_for_datastore(res) != entity.key(): 
    # we have a possible collision, verify and delete? 
    # out two entities are res and entity 

有一對夫婦的邊緣的情況下,可能饒人,比如如果你有兩個實體b和c等於(「A_B」,「」)和(」 a','b_'),所以兩者的連接都是'a_b_'。所以使用你知道的字符不在你的字符串中而不是'_',或者有一個引用列表並且比較所有這些字符。

+0

這是一個非常整潔的解決方案,肯定是+1 – systempuntoout 2011-01-25 22:09:27

1

如果這是一次或很少發生的情況,您可能想嘗試將整個數據庫轉儲到本地計算機 - 請參閱uploading and downloading data - 將數據加載到sqlite3數據庫中,並使用它找到重複的密鑰。

試圖以編程方式做到這一點在GAE上側可能會變成相當繁瑣。與任務完全可行,但不是太容易。

+0

我已經超過35K的記錄,我希望會是隻是一個時間的事情。 – ana 2011-01-25 21:22:47

相關問題