我正在尝试 Google App Engine Java,但是缺乏独特的约束使事情变得困难。
我已经通过这篇文章 https://stackoverflow.com/questions/2626978/unique-constraint-at-data-level-in-gae and 这个博客 http://squeeville.com/2009/01/30/add-a-unique-constraint-to-google-app-engine/提出了一种实现类似功能的方法。我的背景是 MySQL。迁移到没有唯一约束的数据存储让我感到紧张,因为我以前从来不用担心重复值,并且在插入新值之前检查每个值仍然有出错的空间。
“不,你仍然不能指定唯一的
在模式创建期间。”
-- 大卫·昂德希尔 https://stackoverflow.com/users/164602/david-underhill谈论 GAE 和唯一约束(发布链接 https://stackoverflow.com/questions/2626978/unique-constraint-at-data-level-in-gae/2627128#2627128)
你们用什么来实现类似于唯一键或主键的东西?
我听说有一个使用低级 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 过渡到 App Engine 等类似 BigTable 的数据存储时,经常会出现这个问题和其他类似的问题。
讨论通常很有用why数据存储不支持唯一键,因为它告诉您在考虑数据存储方案时应该采取的心态。唯一约束不可用的原因是它极大地限制了可扩展性。正如您所说,强制执行约束意味着检查该属性的所有其他实体。无论您在代码中手动执行此操作还是数据存储在幕后自动执行此操作,它仍然需要发生,这意味着性能较低。可以进行一些优化,但仍然需要以某种方式进行。
你的问题的答案是,认真思考为什么你需要这种独特的约束。
其次,记住按键do存在于数据存储中,并且是强制执行简单唯一约束的好方法。
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())
这将插入或检索具有该电子邮件的用户。
但任何比这更复杂的东西都无法扩展。因此,请认真考虑一下您是否需要该属性具有全局唯一性,或者是否有方法可以消除对该唯一约束的需要。很多时候,您会发现通过一些小的解决方法,您根本不需要该属性是唯一的。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)