PHP MySQL таблица наследования - PullRequest
0 голосов
/ 25 февраля 2012

Я реализую два объекта, например HotDog и Burger, и они оба являются подклассами Food.

Система, над которой я работаю, будет использоваться для создания HotDog и Burger, потенциально других типов Food, но никогда не будет использоваться для создания универсального объекта "Еда".

Еда

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

HotDog:

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

Бургер

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

Эти модели имеют соответствующую таблицу БД, а именно Food, HotDog и Burger.

Как, если я хочу выбрать все HotDog, приготовленные определенным начальником, в настоящее время я должен проходить через каждыйстрока HotDog выглядит следующим образом:

SELECT food_id FROM hotdog

Затем переберите весь набор результатов для каждой строки:

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

Я надеюсьВы понимаете структуру, которую я пытаюсь построить здесь.В настоящее время получение всех food_id для каждой строки HotDog, а затем выбор из таблицы продуктов питания один за другим является серьезным ударом по производительности.

Было бы неплохо иметь возможность просто выполнить:

SELECT * FROM hotdog WHERE cooked_by = chief0001

Однако, как вы можете видеть, текущий способ реализации моделей и таблиц не позволяет мне это делать.Конечно, я могу добавить еще один столбец в таблицы HotDog и Burger, однако, если мне нужно будет запросить что-либо, кроме cooked_by, мне придется добавить еще один столбец в обе таблицы.

В конце концов, я просто добавлю всестолбцы в таблице Food в HotDog и Burger.

Это правильный способ наследования таблиц?Я чувствую, что здесь что-то не так, и должно быть более чистое и лучшее решение.Однако я дергаю себя за волосы, пытаясь придумать хороший способ преодолеть это.

Ответы [ 2 ]

3 голосов
/ 25 февраля 2012

Одно общее решение.У вас есть определенные поля в таблицах хот-дога и бургера, а также все общие поля в таблице продуктов.Тогда вы просто присоединяетесь к таблицам, чтобы получить все поля.Как:

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

, чтобы получить хот-доги.

0 голосов
/ 25 февраля 2012

Обычно я использую два сценария для такой проблемы.

a) Базовая таблица для всех элементов, с полем 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...