这实际上是一个棘手的问题。您所说的表格基本上是一个交易表格,详细说明了您的所有买卖。
从这个意义上说,您会认为在一个表中同时进行买卖是有意义的。
但是,在许多司法管辖区,卖出订单有额外的信息。该信息是用来抵消它的购买订单(出于资本收益或利润目的)。虽然在严格的先买先卖 (FBFS) 环境中这不是必需的,但这绝不是唯一的可能性。
例如,根据澳大利亚法律,您实际上可以用最近一次购买来抵消销售,只要您事先以清晰的语言写下理由。即使我的公司遵循 FBFS,我也可以收到红利或补充股票,然后我可以立即出售。这些抵消了最近购买的股票,而不是我持有 X 年的股票(这通常可以方便地减少应缴税款)。
如果您遵循严格的 FBFS,那么您就不需要额外的信息并且您的交易是对称的。即使他们不是,我已经在一张表中实现了它,其中包含额外的信息,当然对于购买订单毫无用处。这似乎是最简单的方法。
您可以将其作为两个不对称的表来执行,但这会使查询更加成问题,因为您经常需要从两个表中提取数据。如果需要,我的建议是坚持使用包含额外信息的单个表格。
我也永远不会存储平均价格。我更喜欢数量、每股价格和经纪成本。其他每个数字都可以从这三个中计算出来,例如:
AvgPrice = (Brokerage + SharePrice * ShareQuant) / ShareQuant
但有时不可能仅从平均价格向后推算,因为您不知道经纪是什么。
而且我不会有布尔值来表示买入/卖出,对卖出订单使用负数同样容易,并且它使资产负债表类型的计算更加容易,因为您只需对值求和,而与订单类型无关而不是需要根据该订单类型来否定其中的一些。
更新:如果您似乎表明,您只打算存储每家公司的汇总信息,我会选择以下内容:
Companies:
CompanyId primary key
CompanyCode indexed
CompanyName
CompanyBuyQuant
CompanyBuyAvgPrice
CompanySellQuant
CompanySellAvgPrice
然后您根据是买入还是卖出来更新各个列。您不需要单独的行来购买/出售东西。首次添加公司时,数量和价格均设置为 0。
您的实体现在是公司,所以这更有意义。您可能要考虑的一件事是存储买卖股票的总值,而不是平均买卖价格。这将简化您的更新计算,您仍然可以通过将聚合除以数量轻松获得平均值。
所以,下表:
Companies:
CompanyId primary key
CompanyCode indexed
CompanyName
CompanyBuyQuant
CompanyBuyValue
CompanySellQuant
CompanySellValue
- 添加公司时,将所有数量和值设置为 0,
- 当以每股
N 美元购买M 股票时,将M 添加到CompanyBuyQuant 和N * M 到CompanyBuyValue。
- 当以每股
N 美元的价格出售M 股票时,将M 添加到CompanySellQuant 并将N * M 添加到CompanySellValue。
- 获取平均买入价为
CompanyBuyValue / CompanyBuyQuant。
- 获取平均售价为
CompanySellValue / CompanySellQuant。