我正在使用Symfony2和Doctrine2开发应用程序。我有许多存储月度数据的表。一般来说,我这样定义实体:
class Entity {
private $atribute1;
// ...
private $atributeN;
private $year;
private $month;
private $value;
}
我有一些场景,其中一个实体存储与另一个实体相关的每月数据。例如:产品 - 订单关联:
class Product {
private $name;
// ...
}
class Order {
/**
* ORM\ManyToOne(TargetEntity="Product")
* ...
*/
private $product;
private $year;
private $month;
private $value;
}
在这些场景中,数据以表格形式输入,用户在其中为每个产品指定一年中 12 个月的相应值。
我的问题是:以下列方式非规范化设计值表(例如订单)不是更好:
class Order {
/**
* ORM\ManyToOne(TargetEntity="Product")
* ...
*/
private $product;
private $year;
// Value for january
private $month1Value;
// Value for february
private $month2Value;
//...
// Value for december
private $month12Value;
}
我们在一条记录(而不是多条记录)中指定产品值。我认为这种设计将简化价值的持久性,最重要的是产品价值的检索。否则,我将需要编写代码来进行转换以显示每个月的产品值。
一些注意事项:
- 用户/利益相关者只对总值感兴趣(12 个月值的总和)
- 无需按月间隔使用过滤器进行查询。
- 产品值必须显示在带有标题的表格中:PRODUCT、JAN VALUE、FEB VALUE、... DEC VALUE。
- 我知道规范化是基本的,但我也知道我们有时应该在必要时进行非规范化(出于性能原因、设计等)
我正在使用 Symfony2 和 Doctrine,但我的问题与这些框架无关。