日期:2014-05-18  浏览次数:20569 次

自连接表的相关问题(树形结构)
问题一:
自连接表肯定是类似  Id(PK),parentId(FK),name ....了
Id如果是主键的话,parentId就是外键了,
可是树形结构肯定是有根节点了,那么根节点的parentId按理说应该是null,因为根节点没有父节点,
可是主键Id是不能为空的啊,导致外键parentId也不能为null,那我输入数据的时候怎么办呢???

问题二:
我为了避免问题一中的麻烦,我单独弄了个uuid主键ID,而然后是唯一索引Bh(编号),然后是上级编号parentBh
也就是自连接表项为   ID(PK),Bh(unique),parentBh(FK),name... 
这样以来,外键parentId就可以为null了,也就实现了树形结构根节点的父节点为null了。
本来还挺高兴,但是网上有人说我这么设计数据库根本不合理,说外键就应该关联主键,真的是这样么,那我说的问题一如何解决呢?我看很多人定义自连接表,parentId都default null,却不设置为外键,这样根节点的parentId的确默认为null了,可是他们这样岂不是就不能用数据库自带的级联操作了么?只能程序控制parentId和Id的一致性了吧?

问题三:
一开始我是按照问题二描述的那样设计的数据库表,可是后来我发现,如果是两张表有主外键关联关系的话,我修改或删除主表的唯一索引,从表的外键会自动修改或者删除/set null。
可是如果是自连接表的话,就只能级联删除/set null, 却不能级联更新,这是为什么呢?一修改唯一索引就报错。

问题四:
由于我不会在hibernate配置文件里(hbm.xml文件)配置主外键关联,所以只能像以前那样写个基本的pojo和.hbm.xml,然后生成数据库表,最后我在数据库中设置的外键关联,现在使用没出现什么错误,请问是不是可以这样,而不必非得把hibernate配置中也加上<many to one> 和<set>之类的配置呢?

问题五:请问如果客户想要看到数据库表中数据的树形结构,不知道这样的形式是否容易实现呢?

请有耐心、有经验的大神们帮帮小弟吧!

------解决方案--------------------
呵呵,关键是你的父ID可以为空呀。你的思路有问题了。