首页

Mysql正则匹配查询逗号分隔的三大范式

Mysql三大范式2018-07-25518

使用关系数据库在完全遵循三大范式的情况下,不会用到今天的知识,但在实际操作中,有许多情况需要使用逆范式,即为了减少表连接的次数而增加冗余字段,达到提高性能的目的。那么具体该如何实现呢?下面由专业的郑州app开发公司燚轩科技来为大家分享一下。

比如购物车和商品的关系,多对多,每次要查询某个购物车中有哪些商品的时候,需要遍历整个表,对数据库造成不小的压力。这时候如果增加一个字段(cart_goods),以逗号分隔的形式保存商品id,类似(10,15,18,120)那么在读取购物车中的商品的时候可以省去遍历表的步骤,只需要拆分即可获取所有的商品。

那么问题来了,如果只需要以上的查找还好办,如果需要根据此字段来遍历出所有包含某商品的所有购物车,就不太容易了。

比如我想知道所有包含id=18这个商品的购物车,应该如何查询。

首先想到的是拆分,那只能把所有的cart_goods读取出来再拆分成数组,看是否包含,这个很容易想到,但是过程中计算量非常大,因此不推荐。

另一种是用like %18%,这种100以内的还可以,超过100,它把118的也符合要求,显然不行。

那么最后一种方法就是使用正则匹配,可以满足以上需求,思路:数字18前后要么是逗号,要么什么也没有,这种正则表达式也比较简单

where cart_goods regexp ‘(,|^)18(,|$)’ 即可。

顺便科普下三大范式:

1. 第一范式

确保数据表中每列(字段)的原子性。

如果数据表中每个字段都是不可再分的最小数据单元,则满足第一范式。

例如:user用户表,包含字段id,username,password

2. 第二范式(依赖性)

在第一范式的基础上更进一步,目标是确保表中的每列都和主键相关。

如果一个关系满足第一范式,并且除了主键之外的其他列,都依赖于该主键,则满足第二范式。

例如:一个用户只有一种角色,而一个角色对应多个用户。则可以按如下方式建立数据表关系,使其满足第二范式。

user用户表,字段id,username,password,role_id

role角色表,字段id,name

用户表通过角色id(role_id)来关联角色表

3. 第三范式(唯一性)

满足第三范式(3NF)必须先满足第二范式(2NF)。简而言之,第三范式(3NF)要求一个数据库表中不包含已在其它表中已包含的非主关键字信息。例如,存在一个部门信息表,其中每个部门有部门编号(dept_id)、部门名称、部门简介等信息。

4. 逆范式

逆范式化指的是通过增加冗余或重复的数据来提高数据库的读性能。

例如:在上例中的user_role用户-角色中间表增加字段role_name。

逆范式化可以减少关联查询时,join表的次数。

那么关于Mysql正则匹配查询逗号分隔的三大范式就为大家分享到这里了,如果在实际操作中,大家出现错误的话,可以咨询郑州app开发公司燚轩科技获取帮助,或者有好的意见时,也可以分享给我们。

分享到微信朋友圈+
打开微信,点击底部的“发现”,使用 “扫一扫” 即可将网页分享到我的朋友圈。 如何使用?
推荐文章

热贴More +

服务范围More +

联系我们

请扫二维码联系客服

854221200@qq.com

185-3825-9583

QQ客服

关于  ·  招聘  ·  案例中心  ·  网站地图

©@2018 燚轩科技版权所有 豫ICP备16015002号-4

百度提供搜索支持