关于标志位的最佳实践问题

来源:2-8 DB规划

飞雨寒冰

2020-04-05

想请教一下老师关于几个场景下,数据库设计的最佳实践。
例如:
优惠券实例,发放数量有可能是>0的某个正数,也有可能是无限制。
那么这个字段应该如何设计?
是一个字段 - num int ,0表示无限制,或者 -1表示无限制;
还是两个字段 -num_limit tinyint(1) , num int ,num_limit相当于状态位,只当num_limit为0代表无限制,此时num为空,num_limit 为1代表有限制 ,num里面表示限制优惠券数量
这两种方式 哪种好?或者其他的最佳实践。
另一个场景,也是优惠券实例,优惠券的有效时间有可能是一个时间段(比如4.5日到4.7日),也有可能是一个固定的小时,比如24小时有效,这两种情况是互斥关系。
那么是设计3个字段 valid_start_time 、valid_end_time、num_hours,当valid_start_time、valid_end_time有值时,num_hours为空,num_hours有值时,另外两个为空。
还是设计4个字段,valid_type(有效类型)、valid_start_time、valid_end_time、num_hours,当valid_type为0(表示时间段有效),start 、end字段有值,valid_type 为1,num_hours有值。
这两种设计 哪个更合理?或者有其他的最佳实践。
这两个问题本质是一类问题,希望能够得到老师的经验之谈。我这边也很迷糊 最佳实践是什么?
问题一中的num本来是用来表示数量,结果用了0 或者 -1的特殊值表示无限大,这种做法在数据库设计中到底是不是可取的,如果不可取,又是否另外开辟一个标志位来判断。
问题二种又是否需要一个标志位去判断,亦或者不需要标志区,每一次去看num_hours有没有值,再去拿valid_start valid_end里面的值。
问题有点长,不知道我的描述,老师是否能够理解,望解答!

写回答

1回答

sqlercn

2020-04-05

第一个问题 用一个字段就可以了,可以用0表示无限制,大于0的某个数表时具体的限制数量,第二个问题,由于两种类型的表标方式不同,一个是时间区间一个是具体的小时数,所以我认为使用四个字段比较适合,一个字段用来标识是那种类型,其它字段分别表示不同类型的范围。


0
1
飞雨寒冰
非常感谢!
2021-07-29
共1条回复

高性能可扩展MySQL数据库设计及架构优化 电商项目

从基础设计入手,设计高性能可扩展的千万级数据库架构

1155 学习 · 166 问题

查看课程