树形结构
参考 :
http://cnn237111.blog.51cto.com/2359144/1226911
http://www.cnblogs.com/huey/p/4518979.html
我们经常会使用到树形结构,比如做产品分类,国家和州,等等等
那么用关系数据库来实现树形的方式也有很多,各有好坏(我最讨厌就是不统一),所以我们得依据我们的项目需求来采取不同的策略
第一种法案 :
id name parentId
特点:记入的关系少
比起其它方案优势是简单理解,在添加,修改时都不需要批量修改。
坏处就是在select的时候如果想要把子孙也找出来就需要用到递归了。SQL Server 的递归可以参考 : http://database.51cto.com/art/201010/229272.htm
适合项目 :
-如果你的树不大棵(比如你可以控制它的深度),那么就可以使用. 当需要做子孙select的时候先把整颗树拿出来,然后用 where id in (1,2,...)的方式去查询
第2种是使用 :
id name parentId path
特点是path可以保持子孙的关系
好处是我们可以使用 path like = parent% 获取到所有的child
坏处是insert 需要2个query, 第一是创建,第二是把new id 写进path 里头
还有一个麻烦是在当需要修改parent时,它的所有子孙的path也需要修改 (如果项目可以限制这个需求那么就可以使用啦)
适合项目 :
需要select子孙,不会修改parent,树小颗
第3种是使用另一个表来记入关系
好处是树可以很大颗, 查询子孙也很好
坏处是在做任何修改的时候,语句复杂,操作多
第4种
left right key
这和第3种差不多,都是支持大棵树,查询子孙友好
坏处也是一样,修改时有点复杂,操作比较多.
经过实验,我觉得这个还是不错的 .
table : ID,parentID,layer,leftKey,rightKey,text
大家就依据项目来做吧