如何使用非规范化数据保持代码整洁?
How to keep your code clean with denormalized data?
我将分两部分提出这个问题:首先是一般性问题,然后是针对我的特定用例的问题。
一般问题:
我正在构建一个播客应用程序,希望我们会有用户。用户有订阅、设置...,我想将其存储在用户对象上,但订阅和设置不属于我代码中的同一模块。
您如何构建代码以便将有关用户的所有相关数据存储在一起,但定义和处理特定属性的代码可以分开?
我的具体用例
我正在 Google App Engine 上构建后端。我的用户 class 看起来像这样:
class User(ndb.Model):
username = ndb.StringProperty(required=True)
email = ndb.StringProperty(required=True)
...
现在我可以为订阅、设置等添加另一个 属性,但这些定义并不真正属于用户模块。我试过使用 ndb.PolyModel
定义 SubscriptionsHolder
和 SettingsHolder
class,但使用多重继承时,仅支持用户定义中最后一个 superclass 的查询正在查询。
我可以让 settings
和其他模块直接查询用户模型,但这会导致循环依赖,其中用户 users
模块依赖于 settings
subclassing,而settings
依赖users
进行查询。我知道我可以通过四处移动 import 语句来解决循环依赖,但这对我来说似乎是一个 hack。
我的方法是将 User
和 Settings
数据视为独立但相关的集合。我没有使用子类化或使用 PolyModel
,而是简单地引入了一种方法来暗示这些数据集之间的 1:1 关系。
一种方法是将 KeyProperty
添加到 Settings
,然后链接回 User
。另一种方法是使用相关 User
实体使用的相同 id/name 创建每个 Settings
实体。第二种方式允许在您拥有 User
键后直接调用 Settings.get_by_id()
。
我将分两部分提出这个问题:首先是一般性问题,然后是针对我的特定用例的问题。
一般问题:
我正在构建一个播客应用程序,希望我们会有用户。用户有订阅、设置...,我想将其存储在用户对象上,但订阅和设置不属于我代码中的同一模块。
您如何构建代码以便将有关用户的所有相关数据存储在一起,但定义和处理特定属性的代码可以分开?
我的具体用例
我正在 Google App Engine 上构建后端。我的用户 class 看起来像这样:
class User(ndb.Model):
username = ndb.StringProperty(required=True)
email = ndb.StringProperty(required=True)
...
现在我可以为订阅、设置等添加另一个 属性,但这些定义并不真正属于用户模块。我试过使用 ndb.PolyModel
定义 SubscriptionsHolder
和 SettingsHolder
class,但使用多重继承时,仅支持用户定义中最后一个 superclass 的查询正在查询。
我可以让 settings
和其他模块直接查询用户模型,但这会导致循环依赖,其中用户 users
模块依赖于 settings
subclassing,而settings
依赖users
进行查询。我知道我可以通过四处移动 import 语句来解决循环依赖,但这对我来说似乎是一个 hack。
我的方法是将 User
和 Settings
数据视为独立但相关的集合。我没有使用子类化或使用 PolyModel
,而是简单地引入了一种方法来暗示这些数据集之间的 1:1 关系。
一种方法是将 KeyProperty
添加到 Settings
,然后链接回 User
。另一种方法是使用相关 User
实体使用的相同 id/name 创建每个 Settings
实体。第二种方式允许在您拥有 User
键后直接调用 Settings.get_by_id()
。