2012-02-25 7 views
0

私は2つのオブジェクト、例えばHotDogとBurgerを実装しています。それらは両方ともFoodのサブクラスです。PHP MySQLテーブルの継承

私が取り組んでいるシステムは、HotDogとBurger、おそらく他のタイプの食べ物、を作成するために使用されますが、一般的な "Food"オブジェクトを作成するために使用されることはありません。

フード

class Food{ 
    //some fields 
    protected $cooked_by; 
    protected $use_before_date; 
} 

ホットドッグ:

class HotDog extends Food{ 
    //some fields specicifc to HotDog 
    private $sauage_type; 
} 

バーガー

class Burger extends Food{ 
    //some fields specicifc to Burger 
    private $burger_type; 
} 

これらのモデルは、対応するDBテーブル、すなわち食品、ホットドッグとハンバーガーを持っています。

どのように私は特定のチーフで調理されたすべてのホットドッグを選択したい場合は、現在私はこのようなホットドッグのすべての単一の行をループする必要があります。

SELECT food_id FROM hotdog

そして、全体の結果セットをループし、それぞれの行がやって:

SELECT * FROM food WHERE food_id = x AND cooked_by=chief0001

私はあなたが私がここで構築しようとしています構造を理解してほしいです。現在、HotDogの行ごとにすべてのfood_idを取得しなければならず、食卓から1つ1つを選択すると、パフォーマンスが大幅に低下します。

それだけで行うことができるようにいいだろう:あなたが見ることができるよう

SELECT * FROM hotdog WHERE cooked_by = chief0001

をしかし、モデルとテーブルを実装する現在の方法は、私はこれを実行することはできません。もちろん、HotDogテーブルとBurgerテーブルに別の列を追加することはできますが、cooked_by以外のクエリを行う必要がある場合は、両方のテーブルに別の列を追加する必要があります。

最終的に、私はFoodテーブルのすべての列をHotDogとBurgerに追加します。

これは、テーブルの継承を行う正しい方法ですか?私はここに何かがないように感じています。よりクリーンでより良い解決策が必要です。しかし、私はこれを克服するための良い方法を考え出すために私の髪を引っ張っている。

答えて

3

1つの共通の解決策。あなたはホットドッグとバーガーテーブルの特定のフィールドと食卓のすべての共通フィールドを持っています。その後、すべてのフィールドを取得するためにテーブルをジョインするだけです。 Like:

SELECT f.*, h.* FROM food f JOIN hotdog h ON f.id = h.food_id 
WHERE f.chief_id = chief0001 

ホットドッグを取得する。

+0

ありがとうございました!今私はSQL JOIN LOLについて知らないばか者のように感じます。 JOINの操作は一般的に非常に遅いですか? – Gapton

+0

JOINはSQLの不可欠な部分なので、良いSQLエンジンはこのために最適化されている必要があります。また、ON句で使用される両方のフィールド(この例ではf.idとh.food_id)でインデックスを持っていることを確認してください。これは非常にうまくいくはずです:) – Vadim

+0

@VadimこのソリューションはSQLクエリではうまく動作しますが、 'Burger' POST操作や' Food'と 'Burger'の両方を含むPUT操作を頻繁に行う必要がある場合はどうでしょうか?毎回2つのテーブルを更新する必要があるため、パフォーマンスが非常に低下することはありませんか? –

0

私は通常、このような問題に対して2つのシナリオを使用します。

A)タイプ名フィールドに対応するすべての要素をベーステーブル、 - あなたたとえば、具体的なクラス名に対応する文字列、および具体的なタイプのための追加のテーブル

です:

food: 
    id 
    name 
    creation_time 
    type_name (hamburger|hotdog) 

hamburger: 
    food_id 
    with_cheese 

hotdog: 
    food_id 
    with_salad 

b)は、ベース・テーブルすべての要素に対して、type_nameフィールド、上記と同じ、およびコンクリートタイプの値を格納するための2番目のテーブル

food: 
    id 
    name 
    creation_time 
    type_name (hamburger|hotdog) 

food_options: 
    food_id 
    option_name 
    option_value