如何防止Google Cloud Datastore中的重复值?

时间:2015-08-18 17:01:38

标签: duplicates google-cloud-datastore

是否有任何机制可以防止我的实体的某些字段中出现重复数据?类似于SQL unique的东西。

如果不这样做,人们通常使用哪些技术来防止重复值?

2 个答案:

答案 0 :(得分:3)

在SQL中UNIQUE约束上执行等效操作的唯一方法是在像Cloud Datastore这样的NoSQL存储系统中不能很好地扩展。这主要是因为它需要在每次写入之前读取,以及围绕这两个操作的事务。

如果这不是问题(即,您不经常写值),过程可能类似于:

  1. 开始可序列化的交易
  2. 查询所有种类以查找property = value
  3. 的匹配项
  4. 如果查询匹配,则中止事务
  5. 如果没有匹配项,请使用property = value
  6. 插入新实体
  7. 提交交易
  8. 使用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。不需要任何引用,但这只是为了确保唯一性。

  1. 开始交易
  2. 获取id = theNewAccountEmail的UniquePersonEmail
  3. 如果存在则中止
  4. 输入id = theNewAccountEmail的UniquePersonEmail
  5. 将人员以及所有其他详细信息(包括电子邮件)放入
  6. 提交交易

因此您最终需要进行一次读取和两次写入来创建您的帐户。