考虑到我们的项目需要同时在中美部署,我们需要进行数据同步,我们选择的同步方案是:
-
每一条记录都有一个gmt_create_time、gmt_modify_time,gmt_modify_time用于记录更新时间,我们的同步工具会定时的全量跑库中的所有记录,然后对比gmt_modify_time,从而判断是否需要进行更新。
-
倘若有一条记录需要进行更新,我们只需要在一个库中修改其值,然后利用数据同步机制,在美国的库稍后就可以完成修改了。
那么问题在哪了?问题就在于业务复用了这个字段,业务将业务数据的更新时间也用这个字段表示,在一些页面中,我们甚至用这个字段表示记录的更新时间。
这最终带来了什么结果呢?比如,用户3.18日更新了一条记录,记录的详情页面显示的是3.18更新,这个时间是符合业务的需求的。在3.20的一次发版中,我们修改了某个字段的含义,并用脚本全量更新了这个字段的值及gmt_modify_time,并利用同步机制扩散到其他的库中。于是用户理解的修改时间就和他实际操作的不一致的,最终会认为我们库中得数据是错误的。
追根揭底,表单的更新时间,本身也属于业务数据,不应该复用gmt_modify_time。
为什么不多地库同时更新,而不更新gmt_modify_time呢,这肯定是一个可行的办法,但是用这种方案终究不符合数据库设计规范。