三范式
表设计
1.什么时候该把数据copy一份到新创建的表?比如采购单派单后变成供应商的生产订单,那地址是通过关系使用采购单的,还是重新创建一个地址表,从采购表copy一份?
1)通过关系找采购单的地址,采购单地址改了生产订单也改了。
2)通过关系找采购单的地址,生产订单改了影响采购单的地址。
订单一般都是有限状态机,而且都是不可逆的,所以采购单派单之后肯定不能改的。生产订单的收货地址也基本是不会改的。
2.什么时候需要冗余数据?
1)冗余的字段不被修改,比如账号名。
2)不用连表查询,提高性能。
3)有快照的概念。
3.业务表,分析统计表要不同数据库,不同表结构。
业务表日常插入多,简单id查询。
分析统计都是宽表。查询多,插入少。
4.几张表一个业务模型,尽量解开与其他表的联系(领域边界问题)。
连表查询如果超出了业务模型,以后会很难拆分,做服务化。
本人经历过一个优化的工作,原来项目的很多地方需要得到用户名,mapper.xml就连表查询了,最后很难拆分出用户中心。
5.一张表就一个业务概念(有点像设计模式里面单一职责,现在叫单一语意)。
比如员工表(employee)id , name,age,status字段,如果有了账户表概念就会很麻烦,用员工表的name当账号使用会有如下问题。
有一天员工离职了,到了一家新公司但是还是使用你们云平台的系统,请问你该怎么办?离职员工表status状态改离职,
再入职改员工表与企业表对应关系?那员工履历岂不是没了?这种问题根本原因就是违背一样表只有一个语意,记住账号和员工是2个概念,账号自成体系,员工表属于公司组织结构,属于Hr系统的。