我无法以适合数据库的方式表示项目的数据。为了提供帮助,我在以下位置为示例设置了一个 SQL Fiddle:http ://sqlfiddle.com/#!2/6d01c2/14/0
在最简单的情况下,我有三个表:Fund、FundReturn 和 FactorReturn。基金通过 FundReturn 有许多月度回报。基金也有一个地区(如美国或外国),这些地区有所谓的 FactorReturn。因此,FactorReturn 与 Fund 的关系不是直接的,而是通过 Fund 所属的 Region。
**Fund**
fund_symbol | varchar(5) | PRI
region_key | varchar(255) |
**FundReturn**
fund_symbol | varchar(255) | PRI
return_month | int(10) | PRI
return_value | decimal(5,4) |
**FactorReturn**
region_key | varchar(255) | PRI
factor_key | varchar(255) | PRI
return_month | int(10) | PRI
return_value | decimal(5,4) |
目标是拉动基金在给定时间段内的回报以及相应的因子回报以进行一些分析。最终的表示看起来像这样:
fund_symbol | month | fund_return | factor_ret_1 | factor_ret_2 | factor_ret_3
VTI | 201001 | 0.0100 | 0.0200 | -0.0100 | 0.0000
VTI | 201002 | 0.0500 | 0.0300 | 0.0300 | 0.0010
VTI | 201003 | 0.0300 | 0.0100 | -0.0200 | 0.0020
此外,我正在使用 PHP Doctrine ORM 并将数据映射为能够使用如下方法:
$fund = $em->find('VTI');
$fund->getFundReturns(); // Would return array with FundReturn objects.
$fund->getFactorReturns(); // Would return array with FactorReturn objects.
问题
由于数据的性质,尝试在一次查询中同时查询基金收益和因子收益会成倍增加返回的行数。一旦我尝试在 ORM 中使用它,这种情况就会加剧,因为不可能构建具有广泛日期范围的对象图。使用多个查询是我目前的解决方案,但是在使用 ORM 时这很棘手,因为从我的代码中错误地访问关系可能会触发大量 SQL 查询。
http://sqlfiddle.com/#!2/6d01c2/14/0上的查询显示了仅查询 12 个月时如何返回 432 行。
问题
所以我的问题是:
- 有没有更好的方法在数据库中表示这些数据?
- 在 SQL 中查询数据的正确方法是什么?在 ORM 中?