我正在试用 Google App Engine Java,但是由于缺少唯一约束,事情变得很困难。 我一直through this post和 this 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/