这是一个很好的问题,但没有很多细节,很难谈论“最佳”解决方案。
您可以将其映射到关于如何在关系数据库中存储n元树的抽象问题。
这里有一些影响问题的变量:
- 什么是目录结构的总大小?
- 多少独立的虚拟机执行写入操作结构?
- 移动操作是否频繁?
- 是断层整个树的一个重要的操作呢?
- 您的数据库是否支持树状漫步,还是您需要一个可以与任何合理的关系数据库一起使用的解决方案?
以下假定数据库不具有执行树走的特别规定。
n-ary树有两种纯粹的持久性模型。
首先是简单地写在每个节点与父参考:
| NodeId | ParentId | Name | ....
|--------|----------|------------|-----
这种方法简化文件夹的移动,但删除,对于所有的嵌套的子查询,并找到根变得昂贵。
第二纯水模型是坚持从文件夹中的每个细节祖先关系的单独
| NodeId | Name | ....
|--------|----------|------
...
| NodeId | AncestorId | Distance |
|--------|------------|----------|
...
在这里,文件夹/食品/乳制品/奶酪/切达会产生
| NodeId | Name |
|--------|----------|
| #0 | (root) |
| #1 | food |
| #2 | dairy |
| #3 | cheese |
| #4 | cheddar |
| NodeId | AncestorId | Distance |
|--------|------------|----------|
| #1 | #0 | 1 |
| #2 | #0 | 2 |
| #2 | #1 | 1 |
| #3 | #0 | 3 |
| #3 | #1 | 2 |
| #3 | #2 | 1 |
| #4 | #0 | 4 |
| #4 | #1 | 3 |
| #4 | #2 | 2 |
| #4 | #3 | 1 |
这种方法是用于移动非常昂贵,并且一个新的目录导致d
插入,其中d
是从根的距离。但是,子树列表是单个查询。祖先路径也是一个单一的查询;一个order by Distance desc
将让你快速到达根目录和第一个文件夹。
但狭义阅读您的问题,第一种方法的变体,简单地增加根以及可能是你正确的方法:
| NodeId | ParentId | RootId | Name | ....
|--------|----------|--------|------------|-----
注意,移动文件夹将是昂贵的,因为你需要确定所有嵌套的子文件夹,并更新所有这些记录的RootId。
你是什么意思,从叶,快速访问根? *根目录或该文件夹的包含文件夹?无论如何,看起来像一个普通的parent_id机制是可行的,但不知道你在做什么样的操作,很难说如何高效。 –
你觉得它需要多快?既然你提到jQuery,它听起来像一个网络应用程序。网络速度会使基于索引ID的数据库查找变矮。 –