私はOOP/OODにかなり慣れていませんが、学ぶことがたくさんあることに気付いたので、SOコミュニティに意見を求めたいと思います。
基本的に、私はCakePHPのMVCフレームワークを使用しており、構築しているオンラインストアは、次のCREATEステートメントで記述されたCategoryとProductの2つのモデルを使用しています。
CREATE TABLE `categories` (
`id` int(11) unsigned NOT NULL auto_increment,
`name` varchar(255) default NULL,
`parent_id` int(11) default NULL REFERENCES categories(`id`),
`lft` int(11) default NULL,
`rght` int(11) default NULL,
PRIMARY KEY (`id`)
);
CREATE TABLE `products` (
`id` int(11) unsigned NOT NULL auto_increment,
`name` varchar(255) default NULL,
`artist_id` int(11) default NULL REFERENCES artists(`id`),
`description` text default NULL,
`category_id` int(11) default NULL REFERENCES categories(`id`),
`status` enum('in stock', 'pre-order', 'out of stock') NOT NULL,
`price` decimal(6,2) default NULL,
`picture` varchar(255) default NULL,
`picture2` varchar(255) default NULL,
PRIMARY KEY (`id`)
);
オンラインストアには以下が含まれます。
- 音楽
- CD
- DVD
- 衣服
- パーカー
- Tシャツ
- 長袖Tシャツ
- 赤ちゃんの人形
- 帽子
- その他の商人
- ステッカー
- ポスター
- トートバッグ
- ダウンロード
- 着メロ
- MP3
基本的にはこれがカテゴリツリーの構造ですが、将来的には新しいカテゴリを追加する可能性があります。現在、すべての製品はProductクラスオブジェクトとして同等に扱われ、category_idがさまざまなタイプの製品を区別する唯一の方法です。オンラインストアもサイトのほんの一部です。サイトの残りの部分には、アーティストの経歴やディスコグラフィーなどの情報が含まれています。したがって、 Artist、Album、Trackのモデル/テーブルもあります。
これは良いアプローチですか?または、Productクラスから継承するCD/Tシャツ/MP3/ ...用に個別のサブクラスを作成する必要がありますか?ストア内の各音楽CDをディスコグラフィーエントリにリンクして、製品説明のトラックリストやその他の情報を自動的に生成したいと思います。
これが物事を進めるのに良い方法ではない場合、代わりにどのようにそれを行いますか?また、Category / Productクラスにはどのメソッド/プロパティを含める必要がありますか?また、カテゴリツリーのリーフノードにのみ製品をリストする必要がありますか?
編集:
明らかに、この設計は不完全です。Cyrilが指摘したように、Product.priceフィールドが欠落しており、販売の準備はまだありません。私は実際、ストアのこれらの側面を設計および実装するための最善の方法をまだ模索しています。ほとんどの場合、Ordersという別のモデルがありますが、実際には、配送先と注文に含まれる内容に基づいて異なる配送料金を適用しているため、注文の処理はより複雑になります。