关于数据库的一些思考

/

create table 看起简单,但是其中还是有不少需要注意的地方,通常我们使用关系型的数据库才有所谓的建立表的习惯,而是用比如 mongo,redis,elasticsearch 之类非关系型数据库是没有建立表一说的,本文记录一下对数据库表的理解和思考

通常业务系统为了保持稳定和高可用,通常会选择主流的数据库软件,而在主流里面有分为收费的和免费的,开源的和闭源,不过这些都有一个共同特点是都有大的企业在后面开发维护,各种数据库软件的实际对于开发者而言差异并不会太大,因为有一个统一的标准 SQL,让广大的程序员并不会因为一直使用 MySQL 换到 SQLServerPostgreSQL 所有的程序代码都得重新来一遍,且各个编程语言都有对应的 ORM 框架,比如 Java 的 JPA 这种框架,能做到平滑迁移

不过通常一个企业并不会做这种数据库软件的更换。通常也仅发生在,基于成本考虑,把 SQLServer 或者 Oracle 这种收费数据库替换为免费的数据库 MySQL,或者服务体量过大,技术团队无法完成数据方面的优化,换到商业数据库来获得更多的官方团队的支持

为什业务系统应该优先考虑关系型数据库(RDB)

关系型数据对比 NoSQL 数据库,通常有以下优点(但不局限于这些)

易维护

  • 使用广泛,用户基数大,遇到问题,都有很成熟的解决方案
  • 便于优化,比如索引优化和数据缓存
  • 完善的备份和恢复工具,比如云数据库通常提供了 秒级别 的备份和还原
  • 针对复杂的的业务场景,具有更加严格的数据库权限控制
  • 完善的审计日志,便于追踪和审计

易扩展

  • 比如数据库的,(主从分离 / 读写分离)

功能强大

  • 比如 外键,视图, 存储过程,触发器(不过基本不会使用,因为会把程序搞的过于复杂)
  • 强大的查询语法(SQL),绝大部分业务都可以通过一条 SQL 完成,不过如果使用不当,可能也是关系型数据的缺点,过于复杂的连表,容易导致数据查询时服务较高,难优化,不易维护
  • 约束完善,主要体现在,可以对数据库的一个字段进行完整的限制,比如可以针对一个年龄字段,设置最小值和最大值,从逻辑层面规避非法数据入库,又或者对一个网址字段进行长度限制,避免过长的网址入库,导致返回给浏览时,被意外截断,也可以对数据某一个字段的精度进行控制,比如商品的价格,仅保留到分
  • 对数据库数据要求较高的情况,可以使用事务来让数据始终保持一致性和完整性

社区生态完善

  • 活跃的社区,所以能覆盖更多的业务需求
  • 提供完善的商业支持
  • 完善的数据库管理软件(比如 数据库客户端 GUI工具,或者建模软件可以直接图直接生成表)

标准性

绝大多数的关系型数据库,都使用 SQL 标准,大大降低了程序员的学习和使用成本


虽然关系型数据优点众多的, NoSQL 型的数据库,也能存活下来,所以关系型数据库并不是毫无缺点的

非关系型数据库的一些优点

非关系型数据库存在的时间相对较晚一些,从一开始的 Redis 这种专注于高性能缓存的非关系型数据库,到 Mongo 这种能做一些对数据要求不敏感的业务系统,或做日志/分析收集系统,又或者是 elasticsearch 这种专注做数据检索的非关系型数据库,都体现了关系型数据在一些特定业务场景下的劣势

redis 缓存中间件

由于关系型数据,侧重于数据的安全型,一致性,所以 redis 这种直接基于 KV 这种存储方式数据库和绝大部分的处理都在内存完成的特点,更高效率,所以 redis 成了在应用中 数据库,程序,缓存,成了绝大多数商业服务的性能优化的中间键的首选

Mongo 全新一种开发体验

关系型数据,过于强调表和 SQL 这两个概念,有一个固定的格式当然是更好的,但是复杂的表间关系,预先建立约束,对于成熟的系统的确优势很大,但是也带来更多空间使用,和优化成本,所以吸引了 Mongo 一些对关系型数据固有成见的用户,当然 Mongo 也存在一些自己的问题,比如复杂的业务带来了更复杂查询语句,对于不熟悉 javascript 的后端开发人员不友好,又或者是作为也更加专业的日志收集分析系统

ElasticSaerch 更高效的检索数据库

同样的问题,关系型数据过于强调了存储成本和查询查询成本,对于数据大文本内容的检索而言,存在严重的缺陷,比如 MySQL 的 like ,如果一旦针对大文本内容检索很容易出现 IO 使用过高,且无好的优化手段,所以一个专门专门用于解决复杂系统检索的数据库就诞生了, elasticsearch 拥有更多的优化手段,比如对大文本进行预先分词,或者是对存储内容进行分片等,或者预先建立索引,都能很好弥补关系型数据,like ~= 正则这种低效率的查询,甚至还大文本还需要扫描多个文件分页,带来的更低效的查询,比如 elasticsarch 能在 100G 的文档里面,2秒就能完成检索,这个查询效率是关系型数据库没法做到的

其他类型的数据库

  • Neo4j 图数据库,提供了更加复杂的层级的关系的关联
  • HSQLDB/H2 这种内存优先的数据库,广泛用于自动化测试中

思考

任何一个东西诞生出来,并流行到一定程度,都是有其特定优势,或者解决了某些同类型软件的缺点的。所以存在就是合理的,不能盲目的推崇单一的技术或者框架,应该要学会辩证的看待一个事物的优缺点,保持对人或事物的敬畏之心,才能更加游刃有余的在这个快速更新的社会上找到最合适自己的位置

转载请注明作者和出处,并添加本页链接。
原文链接: //xiaochun.zrlog.com/think-of-database.html