库存控制表,2表或1表的设计?

时间:2012-08-09 19:56:52

标签: sql database-design

我目前有一个库存类型表(只显示重要的字段):

Timestamp Account User  Symbol Locates 
---------+-------+---- +------+--------
 2012-...| ABC   | Joe | ZZZ  | 1000
---------+-------+---- +------+--------

每当用户需要调整位置(共享)的数量时,他们就会向表中发布一条新记录。我需要存储几乎完全相同的数据,以便用户调整其持有的股票数量。事实上,唯一不同的字段是Locates字段,对于共享调整,它将被称为Shares,例如:

Timestamp Account User  Symbol  Shares
---------+-------+---- +------+--------
 2012-...| ABC   | Joe | ZZZ  | 2000
---------+-------+---- +------+--------

问题是,为定位器分别设置2个表,为共享设置一个表是否更好,或者是否更好地拥有1个表,将Locates列重命名为Shares并且添加枚举类型列以指示交易类型('LOCATES','POSITION')。

目前还没有报告方面。它仅由用户进行的应用程序商店更改使用,并在重新启动应用程序时重建定位和共享。我无法看到这两种方法的强大优势,所以这更像是一种“最佳实践”类型的问题。

更新

在阅读了一些评论之后,我意识到在不知道如何使用这个表的情况下很难回答。希望这是一个简短的解释:

在每天结束时,我们会清除数据库中的交易数据,以便第二天开始清空数据。这些定位/共享数据都不会每天都被转移。

每天早晨,应用程序启动,并从第三方每天发布到服务器的平面数据文件中加载所拥有的共享和位置共享(在一天开始时没有从数据库加载数据)。在交易日期间,用户可以通过向服务器发送消息来调整份额和/或定位的数量。此消息更新服务器上的内存中的值,并将记录写入此表以显示正确的起始值应该是什么。 (基本上覆盖从平面文件中读取的内容)。

如果我们需要在白天重新启动服务器(很少见,但可能会发生),重新启动时,平面文件中的数据会重新读回应用程序。应用程序还读取此表中的任何记录,并使用帐户/符号组合的最新记录来覆盖从平面数据文件中读取的值。因此,如果我们必须重新启动应用程序,此表将作为额外的每日数据源。

1 个答案:

答案 0 :(得分:1)

您有第三个选项,即有两个数据列,一个用于定位,另一个用于共享。

我认为拥有一个通用列并不是一个好主意,其值取决于枚举类型。这种情况使得容易发生错误。某一天的总股票调整是多少?糟糕,我还包括“定位”。

某些数据库支持计算/计算列。使用这样的数据库,您还可以指定行是用于定位还是用指示符列共享(或两者):

IsLocate as (case when locates is not null then 'Y' else 'N' end),
IsAdjustment as (case when shares is not null then 'Y' else 'N' end),