2015-08-18 56 views
3

是否有任何機制可用於防止我實體的某些字段中出現重複數據?類似於SQL unique如何防止Google Cloud Datastore中出現重複值?

如果失敗了,人們通常會使用哪些技術來防止重複值?

+0

您能提供關於您的數據模型的其他具體細節嗎?數據存儲不支持對屬性的「唯一」約束,還有其他方法,但如果不知道更多關於要實現的內容的信息,很難推薦其中的一種方法。 –

+0

同上。有沒有更多的細節可以分享?如果它確實是一個唯一的標識符,那麼一個關鍵名稱可能會非常合適。如果你想要一個「獨特的財產」,你可以嘗試使用交易,但這可能會很快導致你的性能問題。 –

回答

3

在SQL中的UNIQUE約束中執行等效約束的唯一方法在像Cloud Datastore這樣的NoSQL存儲系統中不能很好地擴展。這主要是因爲它需要在每次寫入之前進行讀取以及圍繞這兩個操作的事務。

如果這不是一個問題(即,你不寫值很頻繁),該進程可能看起來像:

  1. 開始一個串行事務
  2. 查詢所有種類的比賽屬性=值
  3. 如果查詢有比賽,中止交易
  4. 如果沒有匹配,插入新的實體屬性=值
  5. 提交事務

使用gcloud-python,這可能看起來像......

from gcloud import datastore 
client = datastore.Client() 

with client.transaction(serializable=True) as t: 
    q = client.query(kind='MyKind') 
    q.add_filter('property', '=', 'value') 

    if q.fetch(limit=1): 
     t.rollback() 
    else: 
     entity = datastore.Entity(datastore.Key('MyKind')) 
     entity.property = 'value' 
     t.put(entity) 
     t.commit() 

注:Transaction S上的serializable標誌是相對較新的gcloud-蟒蛇。詳細信息請參見https://github.com/GoogleCloudPlatform/gcloud-python/pull/1205/files


的「正確的方式」來做到這一點是設計數據,使得關鍵是你的「獨特性」措施,但不知道更多關於你想要做什麼,我不能說其他很多。