2011-09-23 142 views
4

规划在Java中构建基于文件夹的结构。构建文件夹结构的DataBase(datamodel)

我将为GUI使用jquery插件,所以我不需要关于如何显示文件夹结构的信息。

我正在寻找有关如何存储文件夹信息的后端逻辑,以便可以快速高效地检索它。

每个文件夹都有多个子文件夹。 从页夹,我们应该能够获得迅速的根源,有效

例子:

+Folder1 
    |__SubFolder1_1 
    |__SubFolder1_2 
     |_SubSubFolder1_2_1 
     |_ 
+Folder2 
    |__SubFolder2_1 
     |_SubFolder2_1_1 
     |_SubFolder2_1_2 
      |_SubFolder2_1_2_1 

新文件夹可以随意添加。 文件夹可以重命名。 文件夹可以被删除。

我的问题是:

如何将这些文件夹的细节存储在数据库中?

同样,我正在寻找一种快速高效的方式来存储和检索这些信息。

+0

你是什么意思,从叶,快速访问根? *根目录或该文件夹的包含文件夹?无论如何,看起来像一个普通的parent_id机制是可行的,但不知道你在做什么样的操作,很难说如何高效。 –

+0

你觉得它需要多快?既然你提到jQuery,它听起来像一个网络应用程序。网络速度会使基于索引ID的数据库查找变矮。 –

回答

4

对于DB存储,最简单,最直接的方法是让每个文件夹/节点parent_folder_id。在大多数情况下,这应该足够好,特别是要构建文件夹对象结构并根据对象模型进行操作。

取决于你的需求,还有就是你需要

  1. 某些文件夹下找出所有子文件夹
  2. 直接从数据库进行查找,通过SQL很常见的情况。

如果你在找什么,再有一个,你可以看看有趣的方法: 每个DB记录将有2个额外的数字领域,我们称之为左右

承担树是这样的:

ROOT 
    + A 
    | + A1 
    | + A2 
    + B 
    + B1 

什么将被存储在DB是

Node LEFT RIGHT ... other fields 
ROOT 1 12 
A  2 7 
A1  3 4 
A2  5 6 
B  8 11 
B1  9 10 
  • 每个父节点具有左=第一孩子的LEFT - 1,和RIGHT =最后一个子的RIGHT + 1
  • 叶节点将具有左和右为2个连续数
  • 每个节点的LEFT应该是=事先兄弟姐妹的RIGHT + 1,右=下一个兄弟的左 - 1

当你需要找到某个节点(N)的SQL下的所有节点,只需找出与左> N.LEFT所有节点和右< N.RIGHT

您可以轻松地进行插入/通过批量更新删除的(不是一件困难的TAS相关节点k,给你:P)

这可能不是很OO友好,但如果我提到的要求是你所需要的,你可以考虑使用这种方法。

1

链表,它是Java API在这里记载:

http://download.oracle.com/javase/6/docs/api/java/util/LinkedList.html

作为一般的计算机科学结构,阅读:

http://en.wikipedia.org/wiki/Linked_list

我希望它能帮助

+0

其实更像一棵树,就像“目录树”。 –

+0

@DaveNewton谢谢你,但是我正在寻找如何在数据库中存储(数据模型)的信息,这样我可以存储/快速检索数据的信息。 –

+0

@kensenjohn正确,而且“很快”取决于你试图检索的方式。 –

1

对于数据库,请保持简单。一个名为folder的表 - 唯一的列是Id,Name,ParentId。现在每个文件夹都会有一个父文件夹,并且一些文件夹中会有孩子。要加载的孩子:

SELECT * FROM Folder WHERE Id == ParentFolderId 
6

这是一个很好的问题,但没有很多细节,很难谈论“最佳”解决方案。

您可以将其映射到关于如何在关系数据库中存储n元树的抽象问题。

这里有一些影响问题的变量:

  1. 什么是目录结构的总大小?
  2. 多少独立的虚拟机执行写入操作结构?
  3. 移动操作是否频繁?
  4. 是断层整个树的一个重要的操作呢?
  5. 您的数据库是否支持树状漫步,还是您需要一个可以与任何合理的关系数据库一起使用的解决方案?

以下假定数据库不具有执行树走的特别规定。

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。

+0

谢谢,我将结合使用@AdrianShum提供的答案和答案。由于我将使用更多Adrian的答案,我会将他标记为正确的答案 –