2012-02-25 2 views
0

두 개의 객체 (예 : HotDog 및 Burger)를 구현 중이며 둘 다 Food의 하위 클래스입니다.PHP MySQL 테이블 상속

내가하고있는 시스템은 HotDog와 Burger, 다른 유형의 식품 인 을 만드는 데 사용되지만 일반 "음식"개체를 만드는 데 사용되지 않습니다.

식품

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를 가져와야하며, 식탁에서 하나씩 선택하면 심각한 성능 저하가 발생합니다. 당신이 볼 수있는

SELECT * FROM hotdog WHERE cooked_by = chief0001

그러나 모델을 구현하는 현재의 방법과 테이블이 나를 이렇게하는 것을 허용하지 않습니다 : 그것은 좋은 것

는 할 수 있습니다. 물론 HotDog 및 Burger 테이블에 다른 열을 추가 할 수 있지만 cooked_by 이외의 다른 쿼리를해야 할 경우 두 테이블에 다른 열을 추가해야합니다.

마지막으로 Food 테이블의 모든 열을 HotDog 및 Burger에 추가합니다.

이것이 테이블 상속을 수행하는 올바른 방법입니까? 나는 무언가가 바로 여기에 있지 않다고 느낀다. 그리고 더 깨끗하고 더 나은 해결책이 있어야한다. 그러나 나는 이것을 극복하기위한 좋은 방법을 찾는데 내 머리카락을 끌어 당기고있다.

답변

3

하나의 일반적인 해결책. 핫도그 및 햄버거 테이블에는 특정 필드가 있고 식탁에는 일반적인 필드가 있습니다. 그런 다음 테이블을 조인하여 모든 필드를 가져옵니다. 좋아요 :

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 쿼리에서 매우 잘 작동하지만'Food '와'Burger'둘 다 자주 사용하는'Burger' POST 작업 또는 PUT 작업을해야하는 경우는 어떨까요? 매번 두 개의 테이블을 업데이트해야하므로 성능이 매우 떨어질까요? –

0

나는 일반적으로 이러한 문제에 대해 두 가지 시나리오를 사용합니다.

가) 모든 TYPE_NAME 필드 요소에 대한 기본 테이블 - 구체적인 유형 귀하의 예를 들어

콘크리트 클래스 이름에 해당하는 문자열이며, 추가 테이블 :

food: 
    id 
    name 
    creation_time 
    type_name (hamburger|hotdog) 

hamburger: 
    food_id 
    with_cheese 

hotdog: 
    food_id 
    with_salad 

b)는 기본 테이블 모든 요소에 대해 type_name 필드, 위와 동일하며 구체적인 유형에 대한 값을 저장하는 두 번째 테이블

food: 
    id 
    name 
    creation_time 
    type_name (hamburger|hotdog) 

food_options: 
    food_id 
    option_name 
    option_value