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

What is a better design for storing user preference in Google App Engine?

我在 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)

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

总的来说,我认为这是要走的路,除非你的偏好数量非常多:

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 添加到上述模式,则现有条目将只返回 setting_d 的 None 值,直到 属性 被填充。

我认为拥有 setting_namesetting_value 属性完全忽略了 ndb 的重点。这种模式仅在关系数据库中有用,您需要提前了解整个模式。由于您可以动态地将属性添加到 ndb 模型,因此没有理由不让每个首选项都有自己的 属性.