Java 谷歌应用引擎中的非规范化? 背景:
我正在为Java使用谷歌应用程序引擎(GAE)。我正在努力设计一个能够发挥big table优势和劣势的数据模型,以下是之前的两篇相关文章:Java 谷歌应用引擎中的非规范化? 背景:,java,google-app-engine,database-design,denormalization,bigtable,Java,Google App Engine,Database Design,Denormalization,Bigtable,我正在为Java使用谷歌应用程序引擎(GAE)。我正在努力设计一个能够发挥big table优势和劣势的数据模型,以下是之前的两篇相关文章: 我已经初步决定使用一个完全规范化的主干网,将非规范化的属性添加到实体中,这样大多数客户机请求只需一个查询即可得到服务 我认为完全规范化的主干将: 如果我在反规范化过程中编码错误,请帮助维护数据完整性 从客户端的角度在一个操作中启用写入 允许对数据进行任何类型的意外查询(只要愿意等待) 而非规范化数据将: 使大多数客户端请求能够非常快速地得到服
- 如果我在反规范化过程中编码错误,请帮助维护数据完整性
- 从客户端的角度在一个操作中启用写入
- 允许对数据进行任何类型的意外查询(只要愿意等待)
- 使大多数客户端请求能够非常快速地得到服务
- 这可能被解释为试图规避应用程序引擎的规则,这将导致问题。(它甚至不允许URL调用自己,所以事实上我必须有两个URL资源来处理相互调用的递归)
- 它很复杂,有多个潜在故障点李>
我非常感谢您对这种方法的一些意见。这听起来非常复杂,设计越复杂,编码和维护就越困难 假设您需要对数据进行反规范化,我建议只使用基本的反规范化技术,但要跟踪哪些对象正在更新。如果客户机请求正在更新的对象,您知道需要查询数据库以获取更新的数据;如果没有,您可以依赖非规范化数据。一旦任务队列完成,它就可以从“正在更新”列表中删除该对象,并且一切都可以依赖于非规范化的数据
一个复杂的版本甚至可以跟踪每个对象被编辑的时间,这样一个给定的对象就可以知道它是否已经被任务队列更新了。听起来像是在重新实现物化视图。我建议您使用Memcache的简单解决方案。从客户端更新后,您可以在Memcache中保存一个实体,存储状态为“更新”的已更新实体的密钥。当任务完成时,它将删除Memcached状态。然后,您将在读取之前检查状态,以便在实体仍处于“锁定”状态时正确通知用户。您真的确定使用常规数据库不会更好吗?如果你的应用程序不适合GAE/BigTable(听起来很可能是这样),那么你的生活就会变得不必要的复杂。此外,这听起来并不比常规数据库更适合BigTable