2

我有一些Item我想分组的实例ItemGroup。但是如果一个Item被移动到另一个项目组,出于责任原因,我想跟踪更改。例如,我需要知道一个Item是否ItemGroup在 10 月和另一个在 9 月。

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

我可以选择三张桌子,Item ItemGroup GroupRelation并在GroupRelation. 如果项目信息更新,我需要创建一个新项目和一个新的 GroupRelation。如果项目更改组,我必须创建一个新的 GroupRelation。如果组信息发生更改,我必须创建一个新组和一个新的 GroupRelation。这很复杂,因为我必须在更改时创建多个新对象。

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

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

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

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

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

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

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

有没有人有类似数据模型的经验并有任何建议?这类问题有什么最佳实践吗?

4

2 回答 2

3

我会选择你的Item,ItemGroupGroupRelation作为一个良好的规范化设计,重复最少。

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

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

于 2010-10-04T19:21:40.313 回答
0

GroupRelationHistory根据您的描述,我认为您的模型中隐含着一个 a 的概念。我会把它变成一个自己的实体,比如Item,ItemGroupGroupRelation.

在对象世界中,我会Item意识到它的GroupRelationHistory,这意味着Item对象具有对GroupRelationHistory对象的引用。本质GroupRelationHistory上只是一个零个、一个或多个GroupRelations 的列表。

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

于 2010-10-04T19:57:34.047 回答