google-app-engine - 在 GAE 中实现唯一约束

标签 google-app-engine unique datastore

我正在试用 Google App Engine Java,但是由于缺少唯一约束,事情变得很困难。 我一直through this postthis blog提出了一种实现类似方法的方法。我的背景是 MySQL。在没有唯一约束的情况下迁移到数据存储让我感到紧张,因为我以前从来不必担心重复值,并且在插入新值之前检查每个值仍然有出错的余地。

"No, you still cannot specify unique during schema creation."

-- David Underhill talks about GAE and the unique constraint (post link)

你们用什么来实现类似于唯一键或主键的东西?

我听说过使用低级 api 创建的抽象数据存储层,它像常规 RDB 一样工作,但是它不是免费的(但是我不记得软件的名称)

我的问题的示意图

sNo = biggest serial_number in the db
sNo++
Insert new entry with sNo as serial_number value //checkpoint
User adds data pertaining to current serial_number 
Update entry with data where serial_number is sNo 

但是在第 3 行(检查点),我觉得两个用户可能会添加相同的 sNo。这就是阻止我使用 appengine 的原因。

最佳答案

在谈论从传统 RDB 过渡到类似 BigTable 的数据存储(如 App Engine 的)时,经常会出现这个问题和其他类似问题。

讨论数据存储区为什么不支持唯一键通常很有用,因为它告诉您在考虑数据存储方案时应该采用的心态。唯一约束不可用的原因是它极大地限制了可扩展性。正如您所说,强制执行约束意味着检查该属性的所有其他实体。无论您是在代码中手动执行还是数据存储在幕后自动执行,它仍然需要发生,这意味着性能较低。可以进行一些优化,但仍然需要以某种方式进行。

你的问题的答案是,认真思考为什么你需要那个独特的约束。

其次,请记住键确实存在于数据存储中,并且是实现简单唯一约束的好方法。

my_user = MyUser(key_name=users.get_current_user().email())
my_user.put()

这将保证不会再使用该电子邮件创建 MyUser,并且您还可以使用该电子邮件快速检索 MyUser:

my_user = MyUser.get(users.get_current_user().email())

在 python 运行时你也可以这样做:

my_user = MyUser.get_or_create(key_name=users.get_current_user().email())

这将使用该电子邮件插入或检索用户。

不过,任何比这更复杂的东西都无法扩展。因此,请认真考虑您是否需要该属性是全局唯一的,或者是否有方法可以消除对该唯一约束的需求。很多时候,您会发现通过一些小的变通方法,您根本不需要该属性是唯一的。

关于google-app-engine - 在 GAE 中实现唯一约束,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3855508/

相关文章:

sql - 将表字段更改为 UNIQUE

google-app-engine - 如何从数据存储模型创建嵌套字典?

java - Spring:根据配置文件注入(inject)不同的属性文件

r - 从 r 中的数据框中过滤重复项

ruby-on-rails - 使用已经不唯一的数据添加唯一的两列索引

java - 库 appengine.api.datastore 和 com.google.cloud.datastore 之间有什么区别?

go - 命名空间和祖先在数据结构上的区别

eclipse - Aptana Studio 3 + App Engine Python + 无法解析内存缓存的某些方法

php - 向 Google Cloud PHPMyAdmin 服务器发送 REST 调用不起作用?

google-app-engine - 如何让 WeasyPrint 与 Google App Engine 配合使用