一个python+mysql小项目字段设计的思考

我这个需求的运算量非常小,不是个值得钻牛角尖问题,怎么来都行,但我还是想思考一下类似的情况下正确的做法是什么。

user表里是有身份证号码的,那么性别是应该独立存一个字段,还是每次通过身份证号去算呢?类似的还有出生日期。

也就是说这种该通过增加存储负担来减轻处理负担,还是说能算出来的都不要存?

我的想法是:
性别、生日和身份证号码是独立属性,原则上大多数能推算不代表一定能推算。现实中大量的身份证生日不是真实身份。再比如
生日是农历还是公历?如果按身份证生日去算,有很大概率其实不是用户想要的结果。


数据的原子性只是一个原则,是因为冗余数据同步起来会有各种各样的麻烦。但比起效率来说,这些都是鸡毛蒜皮。典型的场景就是多级缓存,存那么多份,各种额外的同步和更新逻辑,不就是为了提高效率嘛。

再说应用场景:
按生日筛选和按性别筛选在很多场景中是常用操作。每次去实时的算是不能接受的。mysql的索引也就没法做了。一个没有索引的数据库。。。大概不能超过1k行吧。。。

虽然不能说写在where里的字段都要建立索引,但大多数作为条件的字段都可能有索引。主要还是性价比的衡量。因为索引也不是越多越好,太多索引会占用磁盘空间,并且明显降低增删改的效率。一个字段可能只是偶尔用到,可以不建索引。一个字段可能从来不会单独使用,可以不建独立索引。mysql的话有explain命令可以用来分析每条语句使用索引情况和执行效率。

常见的玩法是
Users
userid
username
Devices
deviceid
owner 指向Users.userid

Users每一行记录有一个主键id,用来标识一个用户,用户名根本只是一个普通属性而已,可能重复,可能更改,可能为空,可能非常大非常长。Devices表要关联的最好是稳定唯一消耗少的字段(userid),而不是选个不稳定不唯一消耗大的字段。至于直接再存一次姓名字符串,更不可取了。

你可能感兴趣的:(一个python+mysql小项目字段设计的思考)