我在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)
这些设计的优点和缺点是什么?现在搜索设置并不重要,但将来可能会改变
答案 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_name
和setting_value
属性完全错过了ndb的要点。这种模式仅在您需要提前知道整个模式的关系数据库中才有用。由于您可以动态地向ndb模型添加属性,因此没有理由不将每个首选项都设置为自己的属性。