1

Symfony2Doctrine2を使用してアプリケーションを開発しています。毎月のデータを格納するテーブルがたくさんあります。一般に、エンティティを次のように定義します。

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;
}

これらのシナリオでは、データは表形式で入力され、ユーザーは製品ごとに 1 年間の 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;
}

製品の値は (多数のレコードではなく) 1 つのレコードで指定します。この設計は、値の永続性と、最も重要な製品値の取得を簡素化すると思います。それ以外の場合は、各月の製品値を表示するための変換を行うコードを作成する必要があります。

いくつかのメモ:

  • ユーザー/利害関係者は、合計値 (12 か月の値の合計) だけに関心があります。
  • 月間隔でフィルターを使用してクエリを作成する必要はありません。
  • 製品の値は、ヘッダー付きのテーブルに表示する必要があります: PRODUCT、JAN VALUE、FEB VALUE、... DEC VALUE。
  • 正規化が基本であることは理解していますが、必要に応じて非正規化する必要があることも知っています (パフォーマンス上の理由、設計など)。

私は Symfony2 と Doctrine を使用していますが、私の質問はこれらのフレームワークに関連付けられていません。

4

0 に答える 0