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