什么是在Google App Engine中存储用户偏好的更好设计?

时间:2015-08-03 05:16:26

标签: google-app-engine schema

我在Google应用引擎中有这个对象模型

class UserPref(ndb.Model):
  user_id = ndb.KeyProperty(kind='User')
  setting_a = ndb.BooleanProperty(default=True)
  setting_b = ndb.BooleanProperty(default=True)
  setting_c = ndb.BooleanProperty(default=True)

最近我必须重命名一个属性,它会提示我思考什么是更好的设计:

A)使用三行来捕获原始设计中的一行信息

class UserPref(ndb.Model):
  user_id = ndb.KeyProperty(kind='User')
  setting_name = ndb.StringProperty()
  setting_value = ndb.StringProperty()

B)重复属性

class UserPrefProp(ndb.Model):
  setting_name = ndb.StringProperty()
  setting_value = ndb.StringProperty()

class UserPref(ndb.Model):
  user_id = ndb.KeyProperty(kind='User')
  Prop = ndb.StructuredProperty(UserPrefProp, repeated=true)

这些设计的优点和缺点是什么?现在搜索设置并不重要,但将来可能会改变

1 个答案:

答案 0 :(得分:0)

一般来说,我认为这是要走的路,除非你有一些不喜欢的偏好:

class UserPref(ndb.Model):
  user_id = ndb.KeyProperty(kind='User')
  setting_a = ndb.BooleanProperty(default=True)
  setting_b = ndb.BooleanProperty(default=True)
  setting_c = ndb.BooleanProperty(default=True)

原因是您始终可以添加首选项,与关系数据存储区不同,您不需要修改现有行以使其保持最新。例如,如果在项目的中途将setting_d添加到上述模式,则在填充属性之前,现有条目将仅为settings_d返回None值。

我认为拥有setting_namesetting_value属性完全错过了ndb的要点。这种模式仅在您需要提前知道整个模式的关系数据库中才有用。由于您可以动态地向ndb模型添加属性,因此没有理由不将每个首选项都设置为自己的属性。