在1个表中有2个单独的表或一个附加字段?

时间:2010-05-15 09:38:34

标签: sql database normalization

我正在就各种公司的股票交易进行小型个人申请。

行动可以是出售公司股票或购买。因此,在两种情况下要保存的细节都是:

  1. 股数
  2. 平均价格
  3. 使用单独的表格进行“买入”和“卖出”或者只使用一张表进行“交易”并保留一个从“卖出”中划分“买入”的字段会更好吗?

5 个答案:

答案 0 :(得分:3)

绝对是后一种情况 - 一个表,简单的一个字段(布尔值)定义它是卖还是买。您应该按实体定义表,而不是根据它们执行的操作。

答案 1 :(得分:3)

这实际上是一个棘手的问题。您正在谈论的表基本上是一个交易表,详细说明您所有的买入和卖出。

从这个意义上讲,你会认为在一张桌子上同时购买和销售是有意义的。

但是,在许多司法管辖区,有一个卖单的额外信息。这条信息是哪个买单以抵消它(为了资本收益或利润目的)。虽然在严格的首次购买,首次销售(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,
  • M美元购买N个股票时,将M添加到CompanyBuyQuant,将N * M添加到CompanyBuyValue
  • M美元的价格销售N个股票时,将M添加到CompanySellQuant,将N * M添加到CompanySellValue
  • 将平均购买价格定为CompanyBuyValue / CompanyBuyQuant
  • 获得平均售价CompanySellValue / CompanySellQuant

答案 2 :(得分:2)

我会选择一张桌子。

您可以使用负数表示卖出。这是一种相当标准的指示。减法与添加负数相同!

答案 3 :(得分:2)

一张桌子。每一行/项目都是交易,无论是买入还是卖出。

此外,数量列的汇总将为您提供当前位置。和现金(-1 x数量x价格**)汇总。

如果通过数量的符号推断买入或卖出:不需要单独的列,除非您想要从数量中得出计算列。

**现金:当您卖出(负数量)时,您将获得现金返还(正现金),因此在任何人想知道的情况下为-1乘数。

答案 4 :(得分:1)

“交易”可能含糊不清,我不清楚你想在这做什么。您是否有兴趣仅在每个股票中存储您当前的头寸,或者是否显示该头寸如何发展的交易历史记录?

如果你只是想记录你的持股(如果你可以做空,那么“头寸”可能是一个更好的词)那么我只需记录每个持有的股票。你提到平均价格,但如果你希望在任何时候能够出售部分持股,我会对此保持谨慎。如果您在50,100购买100,在60购买50,平均价格是多少?

除非您希望您的买卖交易数量达到数百万,否则我更倾向于将每个单独的购买或销售记录为单个表格中的单独行,并根据需求显示所需的总数。简单的查询。