今天遇到一个问题,一张采购业务单据,业务上需要他有一张采购跟踪单据,实时跟踪这张采购单据的变化信息的变化。 那么数据库上两张单据的对应关系应该是怎么设计比较合理?我认为应该是一对一的关系(1:1 一张采购单只有一张采购跟踪单据)这样设计的,同事说设计成一对多的(设计上设计成一个1:N,编码上严格控制只有一张跟踪单据),我觉得不对,对编码影响挺大的,该如何分析这个问题,求解?
1:N的设计具备更高的可扩展性.
举例: 假设已经记录了A,B,C三个时点的变化信息. 现在需要新增一个D时点变化的记录.
1:1的设计,你就需要改动整个表结构了; 1:N的设计不过是多录入一条数据而已.
你说的情况就是我现在遇到的情况,设计上有缺陷,这个跟踪单据是跟踪商品的整个生产过程,是一对一的关系的,单据的时间节点放在一张表,是设计缺陷,就算把任务节点拆分开,也只是把这种跟踪表的任务拆分开,但是实际情况是,生产的单据表 和 跟踪表是1:N 关系,我认为生产单据表和跟踪表示1:1关系,然后跟踪表和时间节点任务表示1:N 关系,这样拓展性更好,所以不太理解他的想法,他也就说程序适应数据库,我觉得不合理想上来问问
对编码的影响挺大?怎么大法?你可以问一下同事,为什么要一对多而不是一对一,他应该也是有所考虑的。比如我也曾经这么干过,因为好象Bindingsource+Linq不支持一对一关系的Lazy Loading。
问了,他就说让程序适应数据库设计,而不是数据库设计适应程序、 但是业务上,确实也就是一对一的关系,我们使用ef 好像支持了一对一关系哦。
@矿石兽: 按照我的分析,采购和采购跟踪应该是一对多的关系。因为没有必要再建立一张采购跟踪主表,直接用采购跟踪明细表与采购表构成关系即可。
采购跟踪应该是类似这样的
采购单:10456
日期 描述 经办人
2014-10-1 厂家电话说最近生产压力较大,可能要延迟交货 张三
..... ............... 李四
根据业务需求定
如果只是跟踪单据状态,那么一条记录足以,如果每个状态还有相关审核等等其他附加信息,那么就需要把这个状态提取出来单独一个记录维护
看时机情况而定。
这个业务就是记录一次生产的整个过程, 只有一次审核,也就是整个生产过程完结就通过了,业务上没有分开时间节点,都放在一起了,所有时间节点的业务都整合在一起了,设计上其实是有缺陷的,应该是要把时间节点的任务拆分的。