【发布时间】:2015-10-08 20:52:47
【问题描述】:
在从传统关系数据库迁移到非关系数据库(如 App Engine Datastore)时,如何正确地进行数据建模存在大量问题。
NDB官方文档看了很多遍,网上也试了几个教程,还是卡住了。
我正在开发一个记录我所有个人开支的财务应用程序。这意味着我设计了一个名为 Expense 的实体,上面有一些属性。作为费用的一部分,我还设计了一个供应商实体来存储与商家相关的信息。
这里是实现:
class Expense(ndb.Model):
amount = ndb.FloatProperty(required=False)
description = ndb.StringProperty()
vendor = ndb.KeyProperty(kind=Vendor)
class Vendor(ndb.Model):
companyName = ndb.StringProperty(required=False)
friendlyName = ndb.StringProperty(required=False, default="")
这是检索费用信息的代码:
def get(self):
template_page = "expense.html"
template_values = {'expense':Expense.query()}
self.renderTemplatePage(template_page, template_values)
我在上面的设计中面临的问题是如何检索费用和供应商信息并将其传递给 JINJA 进行渲染。正如我所料,Expense 类中的 Vendor 属性只是一个 Key 而不是对象本身。所以 JINJA 无法理解表达式 {{expense.vendor.friendlyName}}
虽然问题似乎是技术问题,但我相信我的困难与非关系数据库的概念以及我应用于解决方案的类似传统的设计有关。
另一种方法是使用 StructuredProperty 而不是 KeyPrperty。但是,一个解决方案要求是能够重命名供应商友好名称,这将影响所有现有费用。跟踪每个结构化属性并找到更改是很疯狂的。
在放弃 App Engine 并转向 Google Cloud SQL 之前,我想听听一些关于如何解决这种数据建模场景的建议。也许我需要构建的解决方案不推荐用于非关系数据库。
感谢您对此的任何支持。
【问题讨论】:
标签: python google-app-engine google-cloud-datastore data-modeling app-engine-ndb