是否有任何机制可以防止我的实体的某些字段中出现重复数据?类似于SQL unique
的东西。
如果不这样做,人们通常使用哪些技术来防止重复值?
答案 0 :(得分:3)
在SQL中UNIQUE
约束上执行等效操作的唯一方法是在像Cloud Datastore这样的NoSQL存储系统中不能很好地扩展。这主要是因为它需要在每次写入之前读取,以及围绕这两个操作的事务。
如果这不是问题(即,您不经常写值),过程可能类似于:
使用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()
注意:serializable
上的Transaction
标志在gcloud-python中相对较新。有关详细信息,请参阅https://github.com/GoogleCloudPlatform/gcloud-python/pull/1205/files。
"正确的方式"要做到这一点,就是设计你的数据,以便关键是衡量你的独特性,但是如果你不了解更多关于你尝试做什么的话,我就不能说太多其他的话。
答案 1 :(得分:1)
上面给出的方法不适用于数据存储区,因为您无法跨事务内部的任意实体进行查询。如果尝试,将引发异常。
但是,您可以通过为每个唯一字段使用一种新的类型并在事务内执行“获取”(按键查找)来做到这一点。
例如,假设您有一个Person类型,并且您想确保Person.email是唯一的,那么您还需要一种类型,例如UniquePersonEmail。不需要任何引用,但这只是为了确保唯一性。
因此您最终需要进行一次读取和两次写入来创建您的帐户。