日期:2014-05-16  浏览次数:20872 次

文件树结构查询优化(目前查询后可先去喝杯咖啡再回来看结果)
我使用MYSQL建立文件树结构,主要表格有
files 文件表
shares 共享表
users 用户表

files中的关键字段有:
id 文件编号
fid 父编号
name 名称
type 类型:文件夹/文件
userid 用户编号

shares中的关键字段有:
fileid 文件/文件夹编号
userid 用户编号,可以是0.如果是0,表示对应的权限针对所有用户;非0,表示
priv 权限值,第0位(可写)表示:如果fileid对应的是文件夹,则是否允许他人在此创建文件或文件夹;第1位(可穿透)表示如果fileid对应的是文件夹,则共享给他人后,他人是否可以看到非自己的文件或文件夹。不管priv的值是什么,userid对应的用户就可以查看fileid对应的文件或文件夹(只是不一定可以创建或看到他人的文件)

users中关键字段有:
id 用户编号

files表中,有几个系统的固定记录,他们的fid=0,分别是:
桌面 该记录共享给所有用户,可写,但不可穿透。
我的共享 所有我共享的文件或文件夹
他人的共享 他人共享给我的所有文件或文件夹
零碎文件 我的文件或文件夹,但其父亲对我不可见。

定义:我可见的文件(夹)
1. 我的文件(夹)
2. 别人共享给我的文件(夹)
3. 我的文件夹下的文件(可能我的文件夹共享给别人,且可写,因此会有他人的文件)
4. 他人共享给我的文件夹(且该文件夹对我可穿透,参考shares.priv字段)下的文件

现在的问题是要创建文件夹:
根节点是:桌面、我的共享、他人的共享、零碎文件
1 “桌面”下按数据表files中的层次显示我可见的文件,如果有断开,则断开的文件(夹)不显示。
2 “我的共享”下,显示虚拟的节点,即,数据表中的记录实际上都是从“桌面”延伸出去的,并未在“我的共享”下。“我的共享”的直接儿子是我共享给他人的所有记录,每个记录下面按数据表中的层次树显示我可见的文件
3 “他人的共享”下,显示虚拟的节点。其直接儿子是所有他人共享给我的记录,每个记录下面按数据表中的层次树显示我可见的文件
4 “零碎文件”下,显示虚拟节点。其直接儿子是:我的文件(夹),该文件的父亲必须是别人的,且未共享给我。这些记录下面按数据表中的层次树显示我可见的文件。
上述文件树中,桌面下的文件和其他文件夹中可能会有重叠的,例如,如果桌面下的直接儿子A共享给他人了,则A既会出现在“桌面”下,又会出现在“我的共享”下,且两处A节点都可以展开显示我可见的文件(夹)。

大家看看该问题如何优化查询?

------解决方案--------------------
伤不起啊

------解决方案--------------------
看着头疼。。。
------解决方案--------------------
最近也在做树结构的表,一直没有找到好的方式,
什么
层级结构的数据保存在平面的数据库中基本上有两种常用设计方法: 

1、毗邻目录模式(adjacency list model) 

2、预排序遍历树算法(modified preorder tree traversal algorithm) 

都感觉数据量一大,就不行了。

你的这个比我做的更复杂。希望能看到高人的文章。。