在这里记录一些题目和尝试,方便随时查看。面试题-使用树形结构设计mysql数据库表
给了一个树形的数据结构,设计mysql表。面试官要求能设计成动态的,方便经常修改和插入数据的表
1 开始我用省市区联查的方法,面试官认为这是个静态表,不方便增加和修改数据
这种方法就是将所有数据放在一个字段中,增加一个字段,保存其父结点的Id,以此形成结构关系。
问题是如果层级变多,则查询,删除,修改某个节点的所有子类会比较麻烦。因为要递归查询,删除,修改则需要将所有子节点的pid修改。
2 上网学了一下,使用基于左右值编码的改进方案
如图,利用先序遍历给结点编号,在表中保存其前后结点的编号,淡化了父子关系,通过一个范围直接查询子结点。
依据此设计,我们可以推断出所有左值大于2,并且右值小于11的节点都是Fruit的后续节点,整棵树的结构通过左值和右值存储了下来。具体的CRUD操作查看:树形结构的数据库表设计 这个方法的优势是查询不需要递归,查询效率提高;问题是增删需要大量的修改相关结点编号,效率不高且易出错。3 存储关系表和深度
称为闭包表,设计两个表,一个只放值,另一个放父子类关系和其深度。如图是其结构关系
这是其两个数据表设计
第二张表存储了父子关系,数据量很大,但是简化了增删改查的操作,提升了效率。具体操作查看:分析树形数据 需要注意他的一个删除方法:删除D和A的关系而保留了D的子类关系。
这个方法对查询和增删都没有太大问题。