我正在实现两个对象,例如HotDog和Burger,它们都是Food的子类。

我正在使用的系统将用于创建HotDog和Burger,可能还有其他类型的Food,但绝不会用于创建通用的“ 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;
}


这些模型具有对应的数据库表,即食物,热狗和汉堡。

如果我想选择由某位负责人烹制的所有HotDog,当前我必须像下面这样遍历HotDog的每一行:

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以外的任何内容,则必须在两个表中添加另一列。

最终,我将把“食物”表中的所有列添加到HotDog和Burger中。

这是进行表继承的正确方法吗?我觉得这里不对劲,应该有一个更干净,更好的解决方案。但是,我想尽办法解决这个问题。

最佳答案

一种常见的解决方案。您在热狗和汉堡表中有特定的字段,在食物表中有所有常见的字段。然后,您只需联接表即可获取所有字段。喜欢:

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


得到热狗。

10-04 14:38