日期:2014-05-19  浏览次数:20392 次

问一个业务如何设计表的问题
现在有一个表

表名:   项目   project

字段
IDKey   主键
Name     项目名称
Amount   项目金额
Date   完成时间
CreateBy   创建者
CreateDate   创建时间

现在要针对每个项目签合同,原来一个合同对应一个项目.没有问题.
Contract表里面   加上外键为项目主健就行..

现在发生变更:项目可以按照金额拆分和合并

一个合同可能由几个项目合并而成,
而且一个项目也有可能被拆分成几个小项目分别签合同.
还有可能   一个合同对应着   一个项目加上另一个项目的拆分后的一个小项目

这就早成多对多的关系..

现在这个项目表该如何设计呢?

同事说:     在签合同的时候,通过选择的项目生成新的项目存放在项目表中,并且这个新生成的项目   有个字段叫     contactid     .   它表明这个项目是从哪个项目派生出来的.
我觉得这样做有很多问题,请大家多给点建议.

------解决方案--------------------
加一个树形结构的表专门存放项目分类和等级
------解决方案--------------------
典型多对多关系

最典型的设计是

项目表
合同表
项目合同对应表

一共三个表


------解决方案--------------------
恩...類似bom,多加個字段判斷,如果是(虛假)的合同或項目,判斷=phatom
erp中也有所謂的虛假工單,差不多是這樣處理
------解决方案--------------------
项目表 主键id
合同表 主键id
项目合同对应表 两个外键加一个值
--
就这样

------解决方案--------------------
项目表用树形结构表示
合同表用主表明细表表示
------解决方案--------------------
其中项目表是树形结构
------解决方案--------------------
1
------解决方案--------------------
想把这些虚假的项目放到一个新表里是不是好点呢 叫做 ProjectTemp
--------------------------------
感覺差不多,要是放同一個表裡,就加上一個字段flag,加以區別而已.

------解决方案--------------------
怎么会有虚假项目呢?即便它有子项目,它也可以完整的参与一个合同啊。
------解决方案--------------------
既然它都能参与合同了,区别为虚假项目还有什么意义?
------解决方案--------------------
对其中的一个项目为10000的,用户只签了一个5000的
我觉得此时应该把这个10000的标记为虚假项目,因为它不能参与合同了
而剩下那5000还可以签啊。
------解决方案--------------------
项目是树的结构,合同是和树的叶子做关联

project
ID ParentID Name Amount
1 0 A 10000
2 1 A1 5000
3 1 A2 5000 --
4 2 A11 2000 --
5 2 A12 3000 --
6 0 B 8000 --


Contract
ID Name
1 Contract_1
2 Contract_2

ContractProjectRelation
ID ContractID ProjectID
1 1 3
2 1 5
3 2 4
4 2 6
------解决方案--------------------
对于单个项目,是树的结构,你也可以N个数组成一个大树,里面包含N个Project
------解决方案--------------------

对于单个项目,是树的结构,你也可以N个Project组成一个大树,里面包含N个Project
------解决方案--------------------
在项目表里加入一列主项目不就得了 反正一个项目只可能有一个上级项目
主项目没有上级