MySQL数据库之布尔类型、枚举类型和集合类型的应⽤场景
详解
【导读】
四种数据类型:布尔类型、微整型、枚举类型和集合类型,都逐⼀分析这四种数据类型的特性,以及针对每种数据类型做相应的深⼊分析和案例,挖掘出MySQL⼿册没有详细写清楚的部分,相关技术⽂章可以考虑从数据类型系列第⼀篇⽂章开始阅读。
本⽂内容属于基于在此之前分享的6篇关于四种数据类型的⽂章之上,我们结合实际的业务场景和⽣产环境维护成本等多个⾓度进⾏分析,阐述什么样的业务场景,适合使⽤布尔类型、枚举类型和集合类型?使⽤这三种数据类型之后,⼜回给我们带来哪些⿇烦?如何规避这三种数据类型带来的弊端等问题,将会逐⼀解答。
(1). 布尔类型
⼀⽂的测试过程和结论,⾮常清晰地告诉我们:MySQL数据库的布尔类型BOOL或称布尔类型BOOLEAN,等同于微整型TINYINT(1)。MySQL数据库数据类型分类中确实存在布尔类型,但是MySQL数据库并没有真正实现布尔类型,⽽是借助微整型的⽅式实现,并且创建数据库表结构的时候,即使字段
定义属性设置为布尔类型BOOL或布尔类型BOOLEAN,都会被默认改写成TINYINT(1)。
建议:
MySQL数据库产品没有真正实现对布尔类型的⽀持,建议⼤家不要使⽤MySQL布尔类型BOOL或布尔类型BOOLEAN,⽽是使⽤数据库类型微整型TINYINT替代。
(2). 枚举类型ENUM
对枚举类型字段存储数据的数据测试案例分享和总结⽂章为,对枚举类型字段进⾏DDL变更操作⽀持的案例分享和总结⽂章为,通过详尽的测试对⽐过程,对MySQL枚举类型的特点⾮常清晰,我们再简要综合地回顾枚举类型的优缺点:
l 优点
1) MySQL枚举类型的枚举元素允许最⼤65535个,基本够绝⼤多数业务场景使⽤;
2) 引⼊枚举类型数据存储,有利于缩减数据库存储数据的容量,尤其能达到减少数据库瓶颈最⼤的物理IO,逻辑IO也能减⼩,提⾼主机的处理能⼒;
3) 引⼊枚举类型数据存储,有利于简化⼯程师的代码复杂度、⼯作量,增加代码的可读性和可维护性;
4) 可以通过枚举类型元素值访问数据,也可以根据枚举类型元素编号进⾏访问数据;
l 缺点
1) MySQL数据库枚举类型的引⼊,可能给软件程序的版本发布,存在遗忘数据库结构变更的隐患;
2) MySQL数据库枚举类型字段的元素增加,必须以尾部追加的⽅式,否则影响数据库提供数据服务;enum类型如何使用
3) 枚举类型字段不再需要的元素,也不能进⾏删除,否则影响数据库提供数据服务;
4) MySQL数据库枚举类型的字段定义属性元素值,不能随意调整其顺序,否则影响数据库提供数据服务;
建议:
MySQL数据库枚举类型是⼀种有应⽤场景⼴泛的数据类型,若是抛开⽹站程序或软件版本发布,可能会
导致开发⼯程师与数据库维护⼈员之间没有配合好的问题,⾮常推荐⼤家把枚举类型引⼊到⽣产环境的数据库应⽤中,对企业⽽⾔也可以起到节省⼈⼒、物理等成本。建议⼤家使⽤枚举类型的时候,尽量把可能需要⽤到的枚举元素,都写到MySQL数据库表字段的定义属性中,减少出现漏做DDL变更的故障。
(3). 集合类型SET
和⽂章,有完整的测试过程,充分总结MySQL数据库集合类型的优缺点,我们再简要地回顾集合类型的优缺点。
l 优点
1) 数据库的数据存储容量相应缩⼩,利于减少数据操纵的逻辑IO和物理IO;
2) 集合类型的数据读取⽅便,可根据字符串值,也可以根据字符串集合的顺序编号;
3) 集合类型字段的定义属性维护与其他数据类型类似,并不特殊化;
4) 开发⼯程师,不需要借助额外的集合元素编码表或程序中使⽤编号替代集合的字符串元素,达到减少开发成本、提⾼代码的可读性和可维护性;
l 缺点
1) 集合类型字段的集合元素限制最⼤为64个;
2) 集合类型字段的定义属性的集合元素,删除导致锁表⽽影响数据服务提供;
3) 集合类型字段的定义属性的集合元素增加,只能以尾部追加的⽅式,若是此特性没有掌握,则会导致数据服务提供受影响;MySQL数据库⽀持集合类型,对解决⼀些特殊的业务场景提供了⾮常好的解决⽅案,经典应⽤场景案例:
⼈才招聘⽹站的⽤户,设置⼯作意向城市⼀项,则往往会选择1-3个城市,甚⾄更多城市,采⽤集合类型字段作为数据存储结果的话,将可以⼤量简化程序复杂度,以及⼤规模降低数据存储的容量,唯⼀的遗憾则是集合元素限制为64个,会导致⽆法满⾜招聘⽹站后期业务发展需要。
电⼦商务等⾏业特点:
1) 数据分类的种类较多,往往超过总数64的限制;
2) 公司或产品开发维护的技术⼯程师更迭频繁;
3) 电⼦商务、招聘⽹站等⾏业的产品运营周期长;
4) 多数公司的软件程序版本发布流程不健全;
5) 数据库维护⼈员和开发⼯程师的⼯作配合,容易出现信息同步不到位或不周全的情况;
6) ⽤户的数据安全性和正确性,对企业⾮常重要,往往都是花费较贵的推⼴费⽤吸引⽽来的;
MySQL数据库中采⽤集合类型存储数据,⽣产环境的⽹站程序或软件版本更新发布时,⼀旦出现数据库维护⼈员没有优先更新数据库表字段的定义属性,则会导致重⼤的数据丢失事故,给企业造成直接的经济损失。
⽹络游戏⾏业的特点:
1) 有⼤量业务是分类不多的数据需要存储(注:往往是⼏个分类,最多不超过30个分类);
2) ⽹络游戏⾏业要求开发成本降低、开发速度快等特点;
3) ⽹络游戏公司采⽤的数据库服务器的硬件配置差,甚⾄单硬盘的主机⽀撑多个数据库提供数据服务,主机的存储空间也有限;
4) ⽹络游戏产品的⽣命周期绝⼤部分不超过5年,⼀般的⽹络游戏产品运营1年以上就很少再更新软件的版本;
⽹络游戏产品使⽤MySQL数据库集合类型字段存储业务数据,是⾮常值得推荐的⽅式,对开发⼈员⽽⾔,跟使⽤其他数据类型是⼀样的,也⽆额外学习成本,还可以为企业降低开发成本、硬件资源成本。
(4). 总结
系统地分析了布尔类型、枚举类型、集合类型,MySQL数据库没有实现布尔类型,只是借助微整型TINYINT(1)间接实现,为此可以理解MySQL数据库没有布尔类型;集合类型与枚举类型,都各⾃存在⼀个⾮常可怕的弊端 — 数据库结构变更没有做,⽹站程序或软件版本发布已上线,导致⽤户数据丢失的问题,那么我们不使⽤枚举类型或集合类型,能否获得这2种数据类型的优点,规避这2种数据类型的缺陷,为此我们各举⼀个实际应⽤案例。
l 取代集合类型应⽤场景—求职者⼯作意向城市
1) 创建存储城市信息的表City(注:假设只有⼀个字段:城市名称)
2) 创建存储城市编号与求职者ID编号的对照关系表
3) 写⼊⼏条测试数据
4) 通过SQL
语句获得求职者意向城市信息
⼩结:
求职者可挑选⼯作意向城市列表,可以通过后台程序进⾏编辑,并且存储在City表中,可以任意进⾏添加、修改、删除,都不会造成⽹站程序版本的更新,也不会影响数据库提供的数据服务,且城市名称等信息的变更,只要修改City表即可。另外,通过简便的内连接SQL查询语句,就可以符合MySQL⽀持的JOIN连接—嵌套循环算法,效率⾮常⾼,也不需要程序进⾏特殊处理,完全可以取代集合类型的作⽤,唯⼀遗憾就是需要多写点代码。
l 电⼦商务⾏⽹站的商品分类⽬录
1) 创建存储商品分类信息表
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论