現在取り組んでいる(PHPおよびMySQLベースの)Zend Framework 2アプリケーションのモデルには、説明されているものと同様の継承が含まれています here 。
これをデータベースにマッピングするために、私は Class Table Inheritance 設計パターンを使用しています。
私は少し浮気して、「スーパーエンティティ」(つまりスーパータイプ)に知らせます。どのタイプの「サブエンティティ」(つまりサブタイプ)がそれに属しているかを知らせます。つまり、「スーパーエンティティ」には、type
という名前のプロパティ(つまり、属性または列)があります。値はキャメルケースです(アプリケーションでの使用を容易にするため)。テーブル名には常に下線が引かれます。
これは私のデータベース構造を示す図です
そして私のアプリケーションプログラムオブジェクトのクラスモデルを表示する図
問題は今検索です。 Car
をid=123
で取得したいのですが、最初はわかりません。どのtype
があり、どのcar_*
テーブルが必要なのかJOIN
。まあ、すべてのcar_*
テーブルを毎回JOIN
ingするか、2つのリクエストを作成するか(最初のものが「事前リクエスト」のようなもので、type
:SELECT type FROM car;
)ですが、もっと良い解決策があるはずです。
どのようにSELECT
/JOIN
a TABLE
を変数名で使用すると、別のTABLE
で選択した値と同じになります?
すべてのテーブルに描画せずに直接行うことはできません。最初に必要なテーブル名を選択してから、アドホックSQLを使用するか、テーブルごとに特定のプロシージャを呼び出してデータを取得する必要があります。
次のようにすべてのテーブルを描画すると機能します。
SELECT ac.carID, ac.type, ac.commonAttribute1, ac.commonAttribute2
, ct.specialAttributeA
, ca.specialAttributeB
, cb.specialAttributeC
FROM AbstactCar ac
LEFT OUTER JOIN
CarTesla ct ON ct.carID = ac.CarID
LEFT OUTER JOIN
CarAstonMamn ca ON ca.carID = ac.CarID
LEFT OUTER JOIN
CarBMW cb ON cb.carID = ac.CarID
ただし、これは、すべてのタイプを事前に知っている必要があること、および/またはタイプが追加/ドロップ/変更されるたびにクエリを更新する必要があること、および特定のSELECT
のテーブル数の制限に達する可能性があることによって明らかに制限されます。非共通属性が複数のサブクラスに出現する可能性がある場合は、その出力列の定義をca.specialAttributeD, cb.specialAttributeD AS specialAttributeD
のようなものに変更します。
注:上記はmysqlと互換性があると確信していますが、私は通常、MS SQL Serverフェローであり、テストしていないため、構文を少し調整する必要があります。