葛胖胖的小草屋 一言不合 rm -fr /

无限级分类数据库设计

2018-06-22
cossete

阅读:


场景

在国家或人员关系数据库设计时,会遇到无限级分类的情况,优良的数据库设计会给程序性能带来提升

常用方法

数据库设计一个pid关联父级的id,设计如下:

avatar

使用递归方法得出pid=0所有的子类及子类的子类,在数据量多的时候,该方法会给数据库很大负担

class Index
{
    static $country;
    
    public function index()
    {
        $ch = db('country')->where('pid',0)->find();
        $this->getTree($ch['id']);
        var_dump(self::$country);
    }

    public function getTree($pid){
        $res = db('country')->where('pid',$pid)->select();
        if(!empty($res)){
            foreach ($res as $key => $value) {
                self::$country[] = $value;
                $this->getTree($value['id']);
            }
        }
    }
}

方法改进

设计如下图

avatar

 //这样我们就很轻松的得出pid=0的所有子类及子类的子类
 $sql = 'SELECT * FROM %s WHERE `pid` LIKE \'%s\'';
 //这边pid可以添加索引,提高查询效率
 $sql = sprintf($sql,'_country','0,%');
 $tree = db()->query($sql);
 var_dump($tree);

总结

两种方法各有优缺,场景适用就好


Similar Posts

下一篇 RESTful API规范

Comments