【发布时间】:2012-08-09 19:56:52
【问题描述】:
我目前有一个库存类型表(仅显示重要的字段):
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 并添加 Enum 类型列来指示交易类型('LOCATES','POSITION')。
目前还没有这方面的报告。它仅用于用户所做的应用程序存储更改,并在重新启动应用程序时重建定位和共享。我看不出任何一种方法都有很大的优势,所以这更像是一个“什么是最佳实践”类型的问题。
更新
读了一些 cmets 后,我意识到如果不知道这张表是如何使用的,很难回答。希望这里有一个简短的解释:
每天结束时,我们会从数据库中清除交易数据,以便第二天开始时就没有数据了。这些定位/共享数据都不会每天结转。
应用程序每天早上启动,并从第三方每天发布到服务器的平面数据文件中加载拥有的共享和定位的共享(一天开始时没有从数据库加载数据)。在交易日内,用户可以通过向服务器发送消息来调整股票数量和/或定位。此消息更新服务器上内存中的值,并且还将记录写入此表以显示正确的 starting 值应该是什么。 (基本上覆盖了从平面文件中读取的内容)。
如果我们需要在白天重新启动服务器(这种情况很少见,但可能发生),在重新启动时,平面文件中的数据会重新读回应用程序。应用程序还读取此表中的任何记录,并使用帐户/符号组合的最新记录来覆盖从平面数据文件中读取的值。因此,如果我们必须重新启动应用程序,此表将用作额外的每日数据源。
【问题讨论】:
-
在工作中,我们的财务数据库以更一致的方式使用第二种方法。
-
@EplusL:你能解释一下你所说的“更一致”是什么意思吗?你的意思是因为它对所有类型的交易强制执行相同的数据结构?
-
听起来
Shares是派生 信息(基于Locates的运行总数),您通常不应该这样做(由于潜在的不匹配)。我们在这里谈论多少行?您也许可以动态派生Shares。 -
@X-Zero:
Shares不是派生信息。每个记录都完全独立于其他记录。但是,只有每个帐户的最近记录,符号组合才重要。Locates是您可以借 的股份,Shares是您拥有 的股份。所以它们是同一个对象的不同属性。共享和定位是独立编辑的。用户将在一天中发生改变基本数量的事情时调整任一数量。 -
@SamGoldberg 简短回答是。我们有数以万计的数据列分布在数百个表中。对于更复杂的查询,表乘法往往涉及复杂的连接操作。所以我们宁愿在一个表中添加一列并将行加倍。使查询更简单
标签: sql database-design