1

我有一个表格,可以按每件单品跟踪库存数据。这是表格的简化版本(排除了一些非关键字段):

UniqueID,
ProductSKU, 
SerialNumber,
OnHandStatus,
Cost,
DateTimeStamp

每次给定部分发生问题时,都会创建一个新的审计记录。例如,我的产品 ABC 第一次添加到库存时,我会得到如下记录:

1, ABC, 555, OnHand, $500, 01/01/2009 @ 02:05:22

如果 ABC 序列号 555 的成本发生变化,我得到一个新记录:

2, ABC, 555, OnHand, $600, 01/02/2009 @ 04:25:11

如果这件作品被售出,我会得到另一张唱片:

3, ABC, 555, Sold, $600, 02/01/2009 @ 5:55:55

如果引入一条新的 ABC,我得到这个记录:

4, ABC, 888, OnHand, $600, 02/05/2009 @ 9:01:01

我需要能够在任何时间点尽可能快地获得一组给定产品的现有库存价值。

使用上面的示例,如果我想获取 2009 年 1 月 2 日的产品 ABC 的库存值,我需要为每个唯一的产品/序列号组合选择01/03/之前的最新记录2009 年,状态为“OnHand”,然后将费用加起来。(我不能 100% 确定这个 select 语句在这一点上会是什么样子,但我会做一些实验)。

我的问题:对于我所描述的审计表类型,这是一个好的结构吗?也就是说,如果索引得当,它是否适合快速查询?(我试图想象当这张表增长到数百万行时会发生什么。)

我是否应该将历史记录拆分到一个单独的表中,并且只将每个 ProductID/SerialNumber 组合的最新记录留在“活动”表中?

任何反馈/建议/评论/链接表示赞赏。

谢谢!

4

4 回答 4

3

将实时数据表与审计数据分开,您的生活会变得更加轻松,这是一个非常好的主意。对于正常的日常操作,您甚至不需要查看审计数据,因此将其与您的实时数据放在同一个表中只会让人头疼。

管理此问题的最简单方法是在活动表上放置一个触发器,以便每当插入/删除/更新记录时,它都会自动将新记录插入审计表中。

编辑:扩展凯文对此的想法,我想无论序列号如何,共享相同 SKU 的所有部件都会有相同的价格?如果是这种情况,有一个单独的价格表也绝对是个好主意。

于 2009-04-03T02:40:39.487 回答
1

并非所有值都会立即更新,为什么要复制所有静态信息?我认为你应该有不同的序列号、状态​​和成本表。这些表中的每一个也将具有产品 ID 和更新日期。

这样,您还可以轻松判断产品的哪个部分发生了变化。之前,您需要将产品的所有字段与在第一个字段之前保存的产品的所有字段进行比较。

于 2009-04-03T02:44:59.727 回答
0

首先,一些定义(不是临床定义,只是我自己的概念分离命名法):

==========

初始表:您添加和检索的日常表。

审计表:在其相关初始表中包含任何记录的多个版本的表。

==========

如果审计表的业务用途是能够在任何时间点分辨出记录的样子,我会说它的构造应该与初始表相同(加上唯一的审计 ID)。

如果更重要的是要知道字段值在任何时间点(而不是整个记录)是什么,那么请尝试更缩写的 table-field-value-date 方法。请注意,使用这种方法重建整个记录需要做更多的工作,所以如果可能需要整个记录检索,请忘记它。

总的来说,我认为在大多数情况下,使用最新版本记录的快速性能比使用审计数据的性能更重要。因此,我建议创建与初始表相同的审计表(加上自动编号的代理键),并在添加到初始表时触发将相同数据插入审计表。这使初始表中的记录数量保持相对静态,并且性能不会随着时间的推移而降低。

于 2009-07-14T19:38:27.877 回答
0

您将需要分离您的审计数据。随着时间的推移,将当前数据与审计数据保存在一起会影响性能。

最简单的实现是创建一个与生产模式相同的单独数据库。为审计数据库中的每个表添加一个日期时间戳。从生产主键和新的日期时间戳创建一个复合主键。

在生产数据库上设置触发器,以便生产数据库中的每个插入/更新都会触发对审计数据库的插入。插入审计数据库的值将是新插入的值。

仅将审计数据库用于审计报告目的。

或者,您还可以考虑创建一个数据集市,该数据集市将负责跟踪随时间的变化。(但这需要很多时间和精力)

于 2009-06-08T14:47:07.243 回答