老问题 数据结构 树

hebaobao19880921 2011-07-20 08:41:09
表一是文件夹表 字段有文件夹编号(UniqueIdentifier类型) 文件夹名称 parentid 创建人 创建时间
表二是文件表 字段有文件编号(UniqueIdentifier) 文件夹编号 路径 文件夹名 文件夹大小 创建人 创建时间
点击上传按钮的时候 新建一个文件夹 并且上传多个文件到这个文件夹 我对树形掌握不透彻
这个该怎么去做呢?表结构

--文件夹表
create table t_Folder
(
FolderId uniqueidentifier primary key default(newid()) not null,--唯一标识ID 文件ID
FolderName nvarchar(50) not null,--文件名称
ParentId uniqueidentifier default(newid()) not null,--上级文件ID
CreateOn datetime not null,--创建时间
CreateBy UniqueIdentifier default(newid()) not null,--创建人
ModefyOn datetime not null,--修改时间
ModefyBy uniqueidentifier default(newid()) not null --修改人
)
GO
--资源表
create table t_File
(
FileId uniqueidentifier primary key default(newid()) not null,--唯一标识
FolderId uniqueidentifier default(newid()) not null,--文件夹ID
Filepath nvarchar(256) not null,--文件夹虚拟路径
FileSize bigint not null,--文件大小,以字节(B)存储,动态计算显示
Decription nvarchar(800) not null,--文件描述
CreateOn datetime not null,--创建时间
CreateBy UniqueIdentifier default(newid()) not null,--创建人
ModefyOn datetime not null,--修改时间
ModefyBy uniqueidentifier default(newid()) not null --修改人
)


最终我会读取数据库然后以树形展示到页面上 左侧 展示不能用WEB控件我想到了那个dtree 现在就是上传新建文件夹和文件夹形成树这一步卡主了
...全文
101 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
空怀 2011-07-21
  • 打赏
  • 举报
回复
插入数据也好办啊,先插入文件夹,如果有该文件夹就获得它的编号,没有就新增一个,获得编号。然后再插入文件。文件夹大小也随之改动一下
空怀 2011-07-21
  • 打赏
  • 举报
回复
楼上说的是。你用递归的方法读取文件夹,然后再每次查询完文件夹的时候根据文件夹的编号去读取文件,不就可以了吗
子夜__ 2011-07-20
  • 打赏
  • 举报
回复
看的头疼。

如果加载树形 要有结果



看见这个结构了么。

递归
风声3 2011-07-20
  • 打赏
  • 举报
回复
文件夹表就是 parentid 的数据表结构(方法1)。
唯一可疑的是 parentid 怎么是 not null,树顶级的parentid是什么特征?="" ?=FolderId
然后递归显示文件夹,最终文件夹(这里要判断一下)的时候显示资源表即可

另外,资源表有:Filepath nvarchar(256) not null,--文件夹虚拟路径
不知道具体规则是什么,如果是包含完整路径信息。

参见(方法3)或者可以直接列出目录树。
hebaobao19880921 2011-07-20
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 fonshen 的回复:]
这篇介绍了2种设计方法:http://cto.csdn.net/Hot_Discuss.aspx?Name=wuxuming&pointid=4708
不过通常我用第三种(原创方法,不过估计很多人也有类似设计方法),比如:

name path
-------------------------
c c\
tencent d\program\tencent\
windows ……
[/Quote]
满足不了我的需求- - 我的表已经被主管定死了 你这样是让我重新设计 一张表的树形设计我可以看懂 能那样做窝也不会发帖了
风声3 2011-07-20
  • 打赏
  • 举报
回复
这篇介绍了2种设计方法:http://cto.csdn.net/Hot_Discuss.aspx?Name=wuxuming&pointid=4708
不过通常我用第三种(原创方法,不过估计很多人也有类似设计方法),比如:

name path
-------------------------
c c\
tencent d\program\tencent\
windows c\windows\
system32 c\windows\system32\
d d\
program d\program\
qq d\program\tencent\qq\

当然实际设计时,会有一个数字id,path由id组合,比如:

id name path
-------------------------
1 c 1
2 tencent 5,6,2
3 windows 1,3
4 system32 1,3,4
5 d 5
6 program 5,6
7 qq 5,6,2,7

使用很方便,效率也高:

1、列表树:SELECT * FROM Table ORDER BY path
2、获得qq的路径:SELECT * FROM Table WHERE id IN(5,6,2,7)
3、获得qq的路径深度:depth = qq.path.split(',').length;
4、添加修改删除都还算简单,都只需要在单条记录中操作;

这种方式有两个缺点:
-------------------------
1、理论上,若树深度很大,可能超过 path 定义长度,导致错误;
这个可以忽略,实际应用中深度必然有限,设计足够的path长度即可;更严谨一点的话,程序中判断 path 超过长度,提示错误,回滚操作。

2、单个层次不好排序
这个问题我这样解决,在 path 中增加一位或者多位排序字母,比如:
id name path
-------------------------
1 c B1
2 tencent A5,Z6,F2
3 windows B1,C3
4 system32 B1,C3,D4
5 d A5
6 program A5,Z6
7 qq A5,Z6,F2,G7

这样,使用稍有变化:

1、(不变)列表树:SELECT * FROM Table ORDER BY path
2、(略变)获得qq的路径:SELECT * FROM Table WHERE id IN(5,6,2,7) // 5,6,2,7 通过 path 处理获得
3、(不变)获得qq的路径深度:depth = qq.path.split(',').length;
4、(略变)添加修改删除都还算简单,都只需要在单条记录中操作; // 注意添加排序字母
hebaobao19880921 2011-07-20
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 yujiexiaoyu 的回复:]
什么样的树?把你的代码贴出来啊。
[/Quote]
就是我发的2张表 插入数据后要形成树结构 然后显示到页面啊
我不知道这2张刚如何插入有关系的数据
Yujiexiaoyu 2011-07-20
  • 打赏
  • 举报
回复
什么样的树?把你的代码贴出来啊。
hebaobao19880921 2011-07-20
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 cdf881125 的回复:]
不懂,你既然都可以用树的形式显示出来了,新建的话就往表里添加数据啊。
[/Quote]
我是说前台显示树形我有思路 但是现在要把数据插入到数据库 形成树的结构- -还没显示出来呢
空怀 2011-07-20
  • 打赏
  • 举报
回复
不懂,你既然都可以用树的形式显示出来了,新建的话就往表里添加数据啊。

62,039

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术交流专区
javascript云原生 企业社区
社区管理员
  • ASP.NET
  • .Net开发者社区
  • R小R
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

.NET 社区是一个围绕开源 .NET 的开放、热情、创新、包容的技术社区。社区致力于为广大 .NET 爱好者提供一个良好的知识共享、协同互助的 .NET 技术交流环境。我们尊重不同意见,支持健康理性的辩论和互动,反对歧视和攻击。

希望和大家一起共同营造一个活跃、友好的社区氛围。

试试用AI创作助手写篇文章吧