Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/google-cloud-platform/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Google cloud platform google云数据存储中的复合密钥_Google Cloud Platform_Google Cloud Datastore - Fatal编程技术网

Google cloud platform google云数据存储中的复合密钥

Google cloud platform google云数据存储中的复合密钥,google-cloud-platform,google-cloud-datastore,Google Cloud Platform,Google Cloud Datastore,在GCP数据存储中,我有一个具有3个属性的类 密钥(自动生成) 外部的 外部名称 我不能允许重复的externalName+externalId组合。有可能保持这种唯一性吗?数据存储不强制这样的约束。在这种情况下,最接近的方法是使用“externalId”作为键。选项: 按照Robert在回答中所说的去做,尽管您希望使用externalId和externalName的串联作为键。唯一的缺点是,如果externalId或externalName更改,则无法更改密钥。您必须删除当前对象并创建一个新对

在GCP数据存储中,我有一个具有3个属性的类

  • 密钥(自动生成)
  • 外部的
  • 外部名称

  • 我不能允许重复的externalName+externalId组合。有可能保持这种唯一性吗?

    数据存储不强制这样的约束。在这种情况下,最接近的方法是使用“externalId”作为键。

    选项:

  • 按照Robert在回答中所说的去做,尽管您希望使用
    externalId
    externalName
    的串联作为键。唯一的缺点是,如果
    externalId
    externalName
    更改,则无法更改密钥。您必须删除当前对象并创建一个新对象;这可能会对具有指向此对象的关键属性的任何其他对象产生级联影响
  • 在保存之前,检查Model.query(Model.externalId==externalId,Model.externalName==externalName)。计数(1)>0。这里的缺点是获取一个密钥是非常一致的,但查询最终是一致的。这意味着如果两个线程同时提交同一对,两个线程都会成功
  • 将唯一组合保存在键中,但保存在名为
    unique
    的单独表中。下面是一个来自
    webapp2
    的源代码的示例,他们就是这样做的 使用
    externalId++externalName
    作为键


    例如:
    externalName
    externalName | externalName
    等..

    现在,我正在做第三个选项,但不知道这个限制的原因。迪纳摩:你觉得第三种选择有什么不便之处?如果您认为解决方案不够好,可以提交一个文件。此功能早在2008年就被请求了,但数据存储团队表示他们不会实现它:。我觉得这有点不方便,因为使用web应用程序代码实现数据库功能本身就很脆弱。你可能会错误地忽略它。鲁本C-这与不便无关。这是一个基本要求,所有的建议都是权宜之计,而不是解决方案。