从数据库规范化角度判断该Django模型外键冗余设计是否合理?
Django模型设计合理性判断
给定参考代码
class User(models.Model): ... class Phone(models.Model): user = models.OneToOneField(User) phone = models.TextField() class profile(models.Model): user = models.OneToOneField(User) user_phone = models.OneToOneField(Phone)
结论:从数据库规范化角度判断,该设计不合理
原因分析
- 违反第三范式(3NF)要求:第三范式明确要求数据表中不能存在可通过其他关联关系推导得到的冗余字段。当前模型中
profile的user_phone字段完全可以通过profile.user.phone的关联链式访问获取,属于冗余存储,不符合规范化设计要求。 - 存在数据一致性隐患:冗余字段会额外增加数据维护成本,当
Phone表和User的绑定关系发生变更时,需要同时修改profile表的user_phone字段才能保证数据一致,一旦出现漏改、错改,就会出现同一条用户数据关联两个不同手机号的矛盾问题。
注:如果是为了降低关联查询开销做的反规范化业务折中,属于性能优化的特殊处理,但不符合纯数据库规范化的设计标准。
内容的提问来源于stack exchange,提问作者Jiss Raphel
相关产品推荐
相关产品推荐

