SQL反模式学习笔记11 限定列的有效值
目标:限定列的有效值,将一列的有效字段值约束在一个固定的集合中。类似于数据字典。
反模式:在列定义上指定可选值
1、 对某一列定义一个检查约束项,这个约束不允许往列中插入或者更新任何会导致约束失败的值:
create table Bugs(status varchar(20) check(status in('new','in progress','fixed')))。
2、使用域或者用户自定义类型(UDT)等方法。
3、使用触发器:编写一个触发器,当修改指定列的内容时触发,将被修改的值和允许输入的值进行匹配,
如果不符合则产生一个错误中断操作。
缺点:
1、 无法查询出所有的约束值来供上层应用程序使用。
不能用select distinct status from Bugs,因为可能有的status目前还没有存储。
维护不好的话,还有可能造成列表和数据库存储的值,不一致。
2、增加新的约束值,需要修改数据库定义或者触发器。
3、废弃或修改某个值,可能要修改大量的数据,风险很大也不合理。
4、可移植性差,check约束、域,或者UDT在各种数据库中的支持形式并不统一。
如何识别反模式:当出现以下情况时,可能是反模式
1、我们不得不将数据库下线,才能在程序中加入一个新的选项。
2、这个Status列可以填入这些候选值中的一个。我们不应该改变这个后选值列表。
3、程序代码中关于业务规则的选项列表和数据库中的值又不同步了。
合理使用反模式:
1、在后选值几乎不变化的时候可以使用。
2、存储没有业务逻辑且不需要改变的候选值时非常方便。
比如存储一对二选一切相互对立的值:Left/Right、On/Off等。
3、Check约束可以再更多的场景下使用,比如用来检测一个时间区间中start永远小于end。
解决方案:创建一张检查表(类似于字典表),每一行包含一个允许在列中出现的候选值,然后在目标表中定义一个外键约束。
个人经验:在系统中创建一个数据字典表,管理所有可变的候选集合。
结论:在验证固定集合的候选值时使用元数据;
在验证可变集合的候选值时使用数据。
SQL反模式,系列学习汇总
18、SQL反模式学习笔记18 减少SQL查询数据,避免使用一条SQL语句解决复杂问题
成在管理,败在经验;嬴在选择,输在不学! 贵在坚持!
个人作品
BIMFace.SDK.NET
开源地址:https://gitee.com/NAlps/BIMFace.SDK
系列博客:https://www.cnblogs.com/SavionZhang/p/11424431.html
系列视频:https://www.cnblogs.com/SavionZhang/p/14258393.html
技术栈
1、Visual Studio、.NET Core/.NET、MVC、Web API、RESTful API、gRPC、SignalR、Java、Python
2、jQuery、Vue.js、Bootstrap、ElementUI
3、数据库:分库分表、读写分离、SQLServer、MySQL、PostgreSQL、Redis、MongoDB、ElasticSearch、达梦DM
4、架构:DDD、ABP、SpringBoot、jFinal
5、环境:跨平台、Windows、Linux、Nginx
6、移动App:Android、IOS、HarmonyOS、微信小程序、钉钉、uni-app、MAUI
分布式、高并发、云原生、微服务、Docker、CI/CD、DevOps、K8S;Dapr、RabbitMQ、Kafka、RPC、Elasticsearch。
欢迎关注作者头条号 张传宁IT讲堂,获取更多IT文章、视频等优质内容。
出处:www.cnblogs.com/SavionZhang
作者:张传宁 技术顾问、培训讲师、微软MCP、系统架构设计师、系统集成项目管理工程师、科技部创新工程师。
专注于企业级通用开发平台、工作流引擎、自动化项目(代码)生成器、SOA 、DDD、 云原生(Docker、微服务、DevOps、CI/CD);PDF、CAD、BIM 审图等研究与应用。
多次参与电子政务、图书教育、生产制造等企业级大型项目研发与管理工作。
熟悉中小企业软件开发过程:可行调研、需求分析、架构设计、编码测试、实施部署、项目管理。通过技术与管理帮助中小企业实现互联网转型升级全流程解决方案。
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。
如有问题,可以通过邮件905442693@qq.com联系。共同交流、互相学习。
如果您觉得文章对您有帮助,请点击文章右下角【推荐】。您的鼓励是作者持续创作的最大动力!