私は、ユーザーがジャーナルエントリを記録できるオンラインフードジャーナルを運営しています。エントリには、食品エントリ、運動エントリ、測定値、および完了したタスクの4つのタイプがあります。エントリには、共通のいくつかの属性(たとえば、id、amount、unit_idなど)がありますが、タイプ固有の属性(たとえば、food_id、exercise_idなど)もあります。これは、スーパータイプとサブタイプの関係に最適な候補です。
これが私のテーブルです(簡略化):
CREATE TABLE entries
`id` int
`user_id` int
`created` datetime
`entered` datetime
`amount` float
`unit_id` int
PRIMARY KEY id
CREATE TABLE exercise_entries
`entry_id` int
`exercise_id` int
PRIMARY KEY entry_id
CREATE TABLE food_entries
`entry_id` int
`food_id` int
PRIMARY KEY entry_id
だから私の質問は、CodeIgniterのDataMapper ORMを使用してスーパータイプとサブタイプの関係を設定するにはどうすればよいですか?ユーザーガイドの「関係」セクションと「高度な関係」セクションを見ましたが、何も見つかりません。
DataMapperでそれが不可能な場合は、いくつかの解決策を考えることができます。
- サブタイプ属性をロールアップします(1つの大きなテーブル、ugh)
- スーパータイプの属性をロールダウンします(4つの別々のテーブル、ugh)
- 核になり、Doctrine 2.0 ORMを使用します(YAML構成ファイル、うーん!)
- ネイティブORMがテーブル継承をサポートする別のフレームワークを使用します(CodeIgniterでKohanaとFuelPHPを候補リストに追加しました)。
- スーパータイプとサブタイプの関係を手動でコーディングします(そもそもORMの目的を無効にします)。
私は自分の選択肢のどれにもわくわくしていません。オプション1と2は、独自の頭痛の種になります(この記事の下部を参照)。オプション3は、ハンマーを使った手術のようです。フレームワークコードを書き始めていないので、オプション4を使用できます(CIとKohanaの間で非常に難しい選択でした)。オプション5は私が今いるところです。
助言がありますか?助けてくれてありがとう!