うまくいけば、誰かが例、またはおそらくいくつかの提案された読書を通じて、この問題に光を当てることができます. クラス階層の等価性の後にテーブルをモデル化するための最良の設計アプローチは何だろうと思っています。これは、例を通して最もよく説明できます。
abstract class Card{
private $_name = '';
private $_text = '';
}
class MtgCard extends Card{
private $_manaCost = '';
private $_power = 0;
private $_toughness = 0;
private $_loyalty = 0;
}
class PokemonCard extends Card{
private $_energyType = '';
private $_hp = 0;
private $_retreatCost = 0;
}
さて、このクラス階層と同期するためにテーブルをモデル化するとき、私は非常に似たものを使いました:
TABLE Card
id INT, AUTO_INCREMENT, PK
name VARCHAR(255)
text TEXT
TABLE MtgCard
id INT, AUTO_INCREMENT, PK
card_id INT, FK(card.id)
manacost VARCHAR(32)
power INT
toughness INT
loyalty INT
TABLE PokemonCard
id INT, AUTO_INCREMENT, PK
card_id INT, FK(card.id)
hp INT
energytype ENUM(...)
retreatcost INT
私が抱えている問題は、各Card
レコードを、対応するテーブルの詳細を含むレコードに関連付ける方法を見つけようとすることです。具体的には、どのテーブルを調べる必要があるかを判断する方法です。
関連するテーブルの名前を保持するためにVARCHAR
列を追加する必要がありますか? Card
それが私の仲間と私が到達した唯一の解決策ですが、それはあまりにも「汚い」ようです. ここでは、設計を拡張可能に保つことが重要であり、新しいサブクラスを簡単に追加できるようにします。
誰かがクラス/テーブル階層をミラーリングするクリーンな方法を示す例またはリソースを提供できれば、それは最も高く評価されます.