场景
在国家或人员关系数据库设计时,会遇到无限级分类的情况,优良的数据库设计会给程序性能带来提升
常用方法
数据库设计一个pid关联父级的id,设计如下:
使用递归方法得出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']);
}
}
}
}
方法改进
设计如下图
//这样我们就很轻松的得出pid=0的所有子类及子类的子类
$sql = 'SELECT * FROM %s WHERE `pid` LIKE \'%s\'';
//这边pid可以添加索引,提高查询效率
$sql = sprintf($sql,'_country','0,%');
$tree = db()->query($sql);
var_dump($tree);
总结
两种方法各有优缺,场景适用就好