2.4 数据库结构的设计
2.4.1 好的性能出自好的设计
性能优化贯穿在整个软件生命周期,故而在进行需求分析和设计的时候就应该考虑数据库的性能。
举个例子:假设某电子商务网站需要记录订单的信息,每个订单可能会有若干个商品,同时订单有不同的状态,状态的处理包括了若干个流程。若此时新增一个表,命名为Order_Bad,并将订单及订单中的商品全部都存放在Order_Bad这个表中,那么,当订单数量达到百万级时,订单中的商品可能就会达到千万级了。在这种情况下,若需要查找某些订单的状态,就不得不从这些大量的订单商品数据中去“吃力”地查找,并且由于表结构比较混乱,在为表创建索引的时候,将会有许多不确定因素,这会使得表的维护成本很高。若在进行表设计时使用的是两张主子级关系的表,那么在查找订单信息时,就只需要从这百万级量的数据中去检索数据,从而避免了从千万级表中去检索数据,性能自然而然地也就提升了。所以请牢记“好的性能出自好的设计”,且“优化贯穿着整个软件的生命周期”!
笔者的日常维护工作有很大一部分就是审阅开发人员提交的表结构变更。下面分享一下相应的经验。
1)尽可能地添加数据完整约束,例如非空约束、默认值约束、check约束、唯一约束、外键约束等,这些约束的添加将有助于数据库关系引擎分析执行计划。
2)使用尽可能小的字段类型,特别是大表,尽量小的空间将可以带来更佳的性能。
3)表结构的设计应考虑业务需求带来的操作(查询、更新、删除等)及频率,尽可能地使业务逻辑实现简洁,使用简单的SQL语句,可避免过多的表关联。