如何使用非规范化数据保持代码清洁?

时间:2015-02-10 16:48:34

标签: python google-app-engine google-cloud-datastore app-engine-ndb denormalization

我将分两部分提出这个问题:首先是一般性问题,而不是我具体用例的问题。

一般问题:

我正在构建一个播客应用,希望我们有用户。用户有订阅,设置,...,我想存储在User对象上,但订阅和设置不属于我的代码中的同一模块。

如何构建代码以便将有关用户的所有相关数据存储在一起,但是可以分离定义和处理特定属性的代码?

我的具体用例

我正在Google App Engine上构建后端。我的用户类看起来像这样:

class User(ndb.Model):
    username = ndb.StringProperty(required=True)
    email = ndb.StringProperty(required=True)
    ...

现在我可以为订阅,设置等添加另一个属性,但这些定义并不真正属于users模块。我尝试使用SubscriptionsHolder定义SettingsHolderndb.PolyModel类,但是使用多重继承,只有用户定义中最后一个超类的查询才支持查询。

我可以让settings和其他模块直接查询User模型,但这会导致循环依赖,其中users模块的用户依赖于settings进行子类化, settings依赖于users进行查询。我知道我可以通过移动import语句解决循环依赖,但这对我来说似乎是一个黑客。

1 个答案:

答案 0 :(得分:2)

我的方法是将UserSettings数据视为单独但相关的集合。我没有简单地引入一种方法来暗示这些数据集之间的1:1关系,而不是继承或使用PolyModel

一种方法是将KeyProperty添加到Settings,然后链接回User。另一种方法是创建具有相关Settings实体使用的相同ID /名称的每个User实体。第二种方式允许在您拥有Settings.get_by_id()密钥后直接User来电。