我应该如何在数据库和OOP中建模组关系?

时间:2010-10-04 19:12:47

标签: oop database-design data-modeling erp

我希望在Item组中拥有ItemGroup的实例。但是,如果Item被移动到另一个项目组,我想跟踪问责制原因的变化。例如。我需要知道10月份Item和{9月}是否ItemGroup。{/ p>

我应该如何在数据库中对此进行建模?我应该如何在我的课程中对此进行建模,OOP?我可以看到一些不同的解决方案,但它们在某些方面都很复杂,所以我不知道如何实现它。

要么我可以使用三个表格Item ItemGroup GroupRelation并在GroupRelation上保留时间戳。如果项目信息已更新,我需要创建一个新项目和一个新的GroupRelation。如果Item更改组,我必须创建一个新的GroupRelation。如果组信息被更改,我必须创建一个新组和一个新的GroupRelation。这很复杂,因为我必须在变化时创建多个新对象。

Item
+----+---------+-----+------+
| id | item_nr | ean | name |
+----+---------+-----+------+

ItemGroup
+----+------------+-----+
| id | group_name | vat |
+----+------------+-----+

GroupRelation
+----+---------+----------+-----------+
| id | item_id | group_id | timestamp |
+----+---------+----------+-----------+

另一种解决方案可能是只有两个类ItemItemGroup但是我需要在它们中都有一个时间戳,所以我知道它们何时被更改。如果组已更新,我必须更新属于该组的所有项目,因此这也很复杂。

Item
+----+---------+-----+------+----------+-----------+
| id | item_nr | ean | name | group_id | timestamp |
+----+---------+-----+------+----------+-----------+

ItemGroup
+----+------------+-----+-----------+
| id | group_name | vat | timestamp |
+----+------------+-----+-----------+

并且可能还有其他解决方案,一种可能是将旧版本转移到另一个表格。但是,当查找当前数据和旧数据时,搜索数据会很复杂。或者我可以有一个链接到旧版本的列prev_id

是否有人有类似数据模型的经验并有任何建议?是否有针对此类问题的最佳做法?

2 个答案:

答案 0 :(得分:3)

我会将您的ItemItemGroupGroupRelation作为一个良好的规范化设计,并且重复次数最少。

您的审核要求可以使用针对您需要审核的每个表的附加表进行建模(例如:ItemAuditItemGroupAudit),其中包含您需要审核的字段和时间戳。每次可审计字段更改时,都会填充审计表。

这样,您就拥有了历史记录,并且不会使用历史数据来阻碍您的日常表格。

答案 1 :(得分:0)

根据您的描述,我认为您的模型中隐含存在GroupRelationHistory的概念。我会将其转到自己的实体,例如ItemItemGroupGroupRelation

在对象世界中,我会让Item知道它的GroupRelationHistory,这意味着Item对象具有对GroupRelationHistory对象的引用。基本上GroupRelationHistory只是一个零,一个或多个GroupRelation的列表。

这个概念的引入应该得到实际业务需求的支持。转到您的客户(或某个代表),询问历史记录是否属于自身的实体并具有一定的商业价值。如果是,请考虑这种方法并根据业务需求对其进行改进。然后考虑一下数据库模型,它高度依赖于具体的改进。如果不是,那么我会将历史概念作为Oded提出的纯审计功能。