1 概述
开发人员在做数据字典的设计的时候,一般考虑到的是业务需求,这是正确的。数据字典本是从业务需求来的,通过不断的分析业务,分析出对象,每个对象的属性,对象之间的关系,映射到关系数据库,就是表和字段。
但是,数据库的设计不仅仅局限在业务中。首先 需要说的就是系统的错误跟踪问题,开发人员设计数据字典的时候,往往考虑到的业务应该怎样怎样,但是不会考虑到业务如果错了会怎样怎样,如果出错该如何简单定位错误数据,如何简单找出错误日志;其次,是这个数据库的架构在设计中需要考量的因素。 在7*24小时的系统中,数据字典的设计本身是需要考虑到高可用,复制,移植,这些都是开发人员无法考虑到内容,这些内容是dba需要考虑的。
本文总结经验,从运维的角度给出一些数据库设计的规则,简单化设计
2 关于表的主键设计
原则: 每个表,都应该有一个主键,并且是一个number类型的主键。
描述: 表上有pk,那么每条数据的更新都是可以按照主键跟新,对表的并发是非常有好处的。在oracle数据库中,pk和唯一索引还是有一些区别的,主要就是null数据的问题,由于null不进入索引,所以唯一索引不能限制null的重复性,但是pk是可以限制的。
曾经有开发问我,主键是否可以是一个非number字段的值,当然理论上是没有问题。一般这类的pk生成都是有算法的,比如:时间+某种规则。但是我不建议这样的使用,主要的问题就是有2个
(1)性能问题,在Oracle和Mysql数据库中,数值的运算绝对不会比字符的运算慢。
(2) 数据库架构:如果在多主数据库环境中,为了避免表的主键冲突,都需要把主键错开。按照某个规则生成的字符串依然需要套用这个规则。既然一定要分开,数值会比字符串更加方便。
举例来说:在一个双主的数据库环境中,可以考虑A机器的所有表的主键都是按照1结尾,步长=10,而B机器的所有表的主键都是按照2结尾,步长=10
3 关于表的添加时间和最后修改时间
在我看来,所有的表均需要有添加时间和最后修改时间的设计,特殊的,如果这个表是一张流水表,那么可以只需要有最后修改时间,因为此时最后修改时间=添加时间。
在设计中,很多的开发人员会根据需要来设计这两个字段,如果业务没有需要,那么他们就不设计,即便是有的公司设计规范上要求有这些字段,也仅仅是设计了,业务中不处理这2个字段的内容。那么我们来说几个列子,让大家了解一下这2个字段的重要性
(1) 一个网站的会员,在整个业务中是可以不使用会员的最后修改时间。通常的业务,是显示会员的注册时间。开发人员设计了满足业务需求的表,一点问题没有。然后过了不久,有一个主管希望看今年有修改的会员数量,怎么办?业务变了,只能添加字段,修改功能,但是即使是这样,这个主管只能明年再看数据了,因为今年没有这个数据。
(2) 有一天,数据库要移植了,由于需要7*24小时在线,所以数据是需要在提供对外业务的时候移植。DBA要求开发写一个增量程序,把移植时间内的变量数据移植成功后再覆盖一遍……然后,必须等待数据库所有的表均有最后修改时间才可以,否则这个增量程序就无法上线,无法上线就无法移植,然后……
(3) 有个在线保险系统,用户下了一笔保单,然后有一天,客户投诉,说下单时候的信息和当前的保单信息不符合,用户提供了详细的邮件,截图,的确不符。好吧,我们不知道订单的最后修改时间,无法查找这个订单的情况,然后……
(4) 有一天,为了提高性能,领导说,我们做缓存吧!缓存是需要靠增加刷新的,没有最后修改信息,无法刷新,然后……
这,就是我遇到的实际问题,如果在这么多问题中,你还是觉得表的设计不应该 添加时间和修改时间,那么就真的是自己给自己找麻烦了
4 关于表修改流水的设计
对于核心的,修改敏感的业务,我们是需要做些流水记录的。举例来说:有个用户,突然打电话来说,他的密码被修改了。开发人员检查,的确被修改了,但是什么时候被修改的呢?没有流水记录是无法知道具体情况的,无法查找问题原因,无法给用户答复。当然,这个需求也是项目初期不会有的业务。
5 关于标志的设计
在很多场景中,我们经常会遇到 标志问题。举例来说:我们同步某个表的数据 -》另外一个系统,我们会添加一个标志flag ,标志的设计= 0 没有同步;=1 同步。
仔细分析一下,实际的流程是这样的:=0 没有同步 =1 同步成功,=2 同步失败。如果把=2字段设计出来,那么对于定位错误数据非常有帮助。可以看到究竟是什么样的数据没有同步成功,而且可以告警,说明有错误数据问题,实现业务自动化监控。
6 总结
上述,从运维的角度给出了一些数据库设计经验。所有的开发,均希望可以设计出有扩展性的系统,那么系统如何能够有扩展性,不同的角度是非常重要的,只有通过多个角度去看待问题,才可以设计出好的数据字典。
来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/617982/viewspace-1411940/
,如需转载,请注明出处,否则将追究法律责任。