开发者社区> 张友东(林青)> 正文
阿里云
为了无法计算的价值
打开APP
阿里云APP内打开

SQL反模式:SQL 建模与使用指南

简介: 上周末花了几个小时刷完《SQL反模式》这本书,书里介绍了数据库应用开发者最长遇到的一些问题,虽然这本书面向的读者是使用数据库的应用开发者,但它对数据库管理员、数据库开发者同样会有启发,强烈推荐阅读。
+关注继续查看

SQL_ANTI

上周末花了几个小时刷完《SQL反模式》这本书,书里介绍了数据库应用开发者最长遇到的一些问题,虽然这本书面向的读者是使用数据库的应用开发者,但它对数据库管理员、数据库开发者同样会有启发,强烈推荐阅读。本书涉及的问题包括但不限于

  1. 如何存储多值属性?
  2. 如何使用关系模型表达树结构?
  3. 如何建立主键规范?
  4. 如何支持可变的属性/字段?
  5. 如何从表中随机选择一行?
  6. 如何实现文本查询的需求?
  7. 如何存储文件类型数据?
  8. 如何限定列的有效值?
  9. 如何表达精准浮点数?
    10.如何写出安全(难以 SQL 注入)的 SQL 语句?
  10. ...

针对上面的问题在实际的开发场景中都经常遇到,作者介绍了一系列「反模式」的设计思路,我发现很多都是开发过程中很容易犯的错误。以「如何存储多值属性」为例,最直观的反模式设计思路就是「复用原来字段,格式化的逗号分割列表」,如果需求比较局限,联系人数量不会无限制扩展,针对联系人字段也不会经常有查询、聚合需求,这种方法的确成本很低。

但实际上这种方法缺点很多,比如(1)针对这个字段的查询,基本都得使用正则表达式,而正则表达式没有确定的规范,不同的数据库支持都不一样,导致写出的 SQL 也不具备通用性。(2) 针对该字段里属性的查询无法使用索引 (3)列长度有限制,属性数量扩展有上限 ... 而这些随着应用需求的不断变化,可能对系统产生非常大的影响,扩展起来非常麻烦。

从数据库开发者的角度看,对于这么多可能误用的场景,我们需要思考数据库服务本身能做什么工作来简化、或者规避问题,比如

  1. 很多新的存储引擎都具备了 SAMPLE 随机取样的能力,方便用户随机获取记录,避免了用户
  2. 阿里云数据库上,专门有针对防 SQL 防注入的检查,减小了用户犯错造成的影响
  3. 对于属性可扩展的需求,SQL 可能并不是最佳需求,一些基于 KV、Document 的接口的数据库,如 Redis、MongoDB,可能是更加的选择。
  4. 对于文件存储的需求,存储在数据库节点同机器上文件系统上有很多问题, 但量大的时候,存储在数据库里也无法满足需求;目前比较常用的方案时,文件存储到专门的分布式文件系统里,数据库里存储对象的标识名。

版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

相关文章
SQLSERVER存储过程语法详解
SQL SERVER存储过程语法: Create PROC [ EDURE ] procedure_name [ ; number ]     [ { @parameter data_type }         [ VARYING ] [ = default ] [ OUTPUT ]     ] [ ,...n ]   [ WITH     { RECOMPILE | ENCRY
1578 0
Sql Server 存储过程基础
        将常用的或很复杂的工作,预先用SQL语句写好并用一个指定的名称存储起来, 那么以后要叫数据库提供与已定义好的存储过程的功能相同的服务时,只需调用execute,即可自动完成命令。       存储过程的优点:        1.存储过程只在创造时进行编译,以后每次执行存储过程都不需再重新编译,而一般SQL语句每执行一次就编译一次,所以使用存储过程可提高数据库执行速度
956 0
+关注
张友东(林青)
阿里云高级技术专家
105
文章
18
问答
来源圈子
更多
让用户数据永远在线,让数据无缝的自由流动
+ 订阅
相关文档: 云数据库 OceanBase 版 可信账本数据库 云原生关系型数据库 PolarDB PostgreSQL引擎
文章排行榜
最热
最新