我希望在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 |
+----+---------+----------+-----------+
另一种解决方案可能是只有两个类Item
和ItemGroup
但是我需要在它们中都有一个时间戳,所以我知道它们何时被更改。如果组已更新,我必须更新属于该组的所有项目,因此这也很复杂。
Item
+----+---------+-----+------+----------+-----------+
| id | item_nr | ean | name | group_id | timestamp |
+----+---------+-----+------+----------+-----------+
ItemGroup
+----+------------+-----+-----------+
| id | group_name | vat | timestamp |
+----+------------+-----+-----------+
并且可能还有其他解决方案,一种可能是将旧版本转移到另一个表格。但是,当查找当前数据和旧数据时,搜索数据会很复杂。或者我可以有一个链接到旧版本的列prev_id
。
是否有人有类似数据模型的经验并有任何建议?是否有针对此类问题的最佳做法?
答案 0 :(得分:3)
我会将您的Item
,ItemGroup
和GroupRelation
作为一个良好的规范化设计,并且重复次数最少。
您的审核要求可以使用针对您需要审核的每个表的附加表进行建模(例如:ItemAudit
,ItemGroupAudit
),其中包含您需要审核的字段和时间戳。每次可审计字段更改时,都会填充审计表。
这样,您就拥有了历史记录,并且不会使用历史数据来阻碍您的日常表格。
答案 1 :(得分:0)
根据您的描述,我认为您的模型中隐含存在GroupRelationHistory
的概念。我会将其转到自己的实体,例如Item
,ItemGroup
和GroupRelation
。
在对象世界中,我会让Item
知道它的GroupRelationHistory
,这意味着Item
对象具有对GroupRelationHistory
对象的引用。基本上GroupRelationHistory
只是一个零,一个或多个GroupRelation
的列表。
这个概念的引入应该得到实际业务需求的支持。转到您的客户(或某个代表),询问历史记录是否属于自身的实体并具有一定的商业价值。如果是,请考虑这种方法并根据业务需求对其进行改进。然后考虑一下数据库模型,它高度依赖于具体的改进。如果不是,那么我会将历史概念作为Oded提出的纯审计功能。