1

我将分两部分来提出这个问题:首先是一般问题,而不是针对我的具体用例的问题。如何使用非规范化数据保持代码清洁?

一般问题:

我建立一个播客应用,在那里,希望我们能有用户。用户具有subscripitons,设置,...,我想要存储在用户对象,但订阅和设置不属于我的代码中相同的模块。

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

我的具体使用案例

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

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

现在我只需要添加另一个属性用于订阅,设置等,但是这些定义并不真正的用户模块中的归属。我试着用ndb.PolyModel来定义一个SubscriptionsHolderSettingsHolder类,但是通过多重继承,只有用户定义中最后一个超类的查询才支持查询。

我可以只作settings等模块查询用户模型直接,但这会导致循环依赖,用户的users模块依赖于settings的子类,并settings取决于users进行查询。我知道我可以通过移动导入语句来解决循环依赖问题,但这对我来说似乎只是一种破解。

+0

如何使用用户的StructuredProperty或LocalStructuredProperty来存储设置? – 2015-02-11 00:39:25

+0

是的,这就是我用来存储设置的内容,但我不希望在用户模块中定义该属性。 – bigblind 2015-02-11 01:07:20

回答

2

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

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

+0

这很方便,但是会产生开销,因为需要2个'model.get()'操作来获取用户及其设置。我想将它们存储在同一个模型中,所以我可以做一个'User.get',并获取与该用户相关的所有内容。 – bigblind 2015-02-10 18:02:26

+0

如果必须在单个请求中检索数据,则将这些字段添加到'User'集合。但是用'ndb',一旦你检索到一个'User'实体,它就会保留在缓存中,所以第二个请求要快得多。通过密钥请求一个'Settings'实体也比使用查询要快,所以开销确实没有那么糟糕。 – 2015-02-10 18:06:48