如何使用非规范化数据保持代码的整洁



我将分两部分提出这个问题:第一部分是一般问题,第二部分是针对我的特定用例的问题。

一般性问题:

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

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

我的特定用例

我正在谷歌应用引擎上构建后端。我的用户类看起来像这样:

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

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

我可以让settings和其他模块直接查询User模型,但这会导致循环依赖,其中User users模块依赖settings进行子类化,settings依赖users进行查询。我知道我可以通过移动import语句来解决循环依赖关系,但这对我来说就像是一个破解

我的方法是将UserSettings数据视为单独但相关的集合。我只是引入了一种方法来暗示这些数据集之间的1:1关系,而不是子类化或使用PolyModel

一种方法是将链接回UserKeyProperty添加到Settings。另一种方法是创建具有与相关User实体使用的相同id/名称的每个Settings实体。第二种方式允许在获得User密钥后直接调用Settings.get_by_id()

最新更新