【发布时间】:2016-05-15 16:58:22
【问题描述】:
我有四种主要类型:帐户、公司、服务和地址。我希望在公司和服务实体之间共享地址实体。
- 帐户:这是用户帐户(电子邮件、密码)
- 公司:提供服务的企业(祖先:帐户)
- 服务:由公司(祖先:公司)提供的服务
- 地址:公司或服务(祖先:帐户)的地址(字段组:街道、城市、国家/地区)
挑战: 公司和服务实体可能有不同地址;毕竟,一家公司的地址不一定是获得其服务的地方。服务可能有许多地址,因为公司可能会设立不同的特许经营/销售点,以获取其服务。
我希望以这样一种方式对数据进行建模,即地址可以被公司或服务实体或两者引用。我试过这两种方法:
假设这是地址模型:
class Address(ndb.Model):
street = ndb.StringProperty(required=True)
city = ndb.StringProperty(required=True)
country = ndb.StringProperty(required=True)
方法 1:在 Service 或 Company 中存储地址密钥列表
class Service(ndb.Model):
title = ndb.StringProperty(required=True)
addresses = ndb.KeyProperty(repeated=True)
class Company(ndb.Model):
name = ndb.StringProperty(required=True)
addresses = ndb.KeyProperty(repeated=True)
问题:对于服务或公司的每个页面视图,我都需要执行额外的查询来获取它们各自的地址。随着我们实体数量的增加,这将成为一个代价高昂的大问题。
方法 2:创建一个 AddressMapping 实体,在两个实体之间形成关系:
class Service(ndb.Model):
title = ndb.StringProperty(required=True)
addresses = ndb.KeyProperty(repeated=True)
class AddressMapping(ndb.Model):
entity = ndb.StringProperty(required=True) # service or company
address = ndb.KeyProperty(repeated=True)
问题:如果服务被禁用/删除/修改,我们需要删除/修改所有伴随的 AddressMapping 实体,否则它们将被孤立。查看页面时仍需要其他查询。这似乎也很昂贵。
这是我想出的两种方法;他们看起来都很糟糕。关于如何改进这一点的任何想法?
【问题讨论】:
-
为什么不将公司、服务和地址合并到一个实体中。
-
以正确的方式(标准化)然后进行测试。如果您只关心性能,请在汇编中编写所有内容
-
对我来说,公司和服务听起来像是某个超类的子类。但是我想不出那个超类的名字。如果您想到一个,请相应地编辑您的问题。
标签: google-app-engine database-design google-cloud-datastore data-modeling app-engine-ndb