我需要一些帮助来决定如何最好地设计我的桌子。我有大约200 in的数据,我希望放在一个表(历史期权价格数据)。这张桌子看起来像:
String symbol
Date date
Date exp;
double strike;
double ask;
double bid;
<20 other columns>95%的时间我将获取当前日期的数据。但其他5%的时间我想分析历史数据。
大多数查询都涉及符号/日期/exp的某种组合。
就效率而言,我不知道如何最好地安排这张桌子/S。是否最好将数据放入两个表:历史表和当前表?或者是日期索引?或者可能是额外的布尔列(isCurrent),它指示哪些数据是当前的还是非当前的?
如果有关系,我会在封面下使用java/hibernate/mysql。
谢谢
发布于 2013-04-14 12:27:45
最好的第一个策略是始终将事务数据放在一个规范化的数据存储区中。这将数据完整性问题的风险降到最低,并使您必须编写的代码量降到最低。
通常,人们会发现,人们对绩效有某种关注。这导致他们考虑去正规化。最好是等到您的卷测试证明性能存在真正的问题,而不是假设会出现问题,因为您的表“很大”。
考虑到您有大量的历史数据,而您大多数时间都不使用,那么您可能会从去规范化中受益。不过,在假设是这样之前,您确实应该对此进行测试。如果是这种情况,那么一种可能对您有用的方法是保留两个数据存储:(a)保存当前值的数据存储;(b)保存所有值,包括当前和历史值的方法。
如果这样做有意义(出于性能原因),您应该构建一些自动化来跟踪当前数据的所有更改,并将它们记录在历史记录表中。这最好在DBMS中使用支持触发器的触发器来完成。
几乎从未有意义的是将当前的价值观保留在一个地方,而将历史价值(不包括当前的价值)保留在另一个地方。我从来没有遇到过这样的情况,您只需要查询历史记录,不包括当前值。这意味着,如果以这种方式分隔当前+历史值,则查询必须是当前+历史值的两倍。
这就是我要向你推荐的:
https://dba.stackexchange.com/questions/39919
复制相似问题