资料树结构查询优化(目前查询后可先去喝杯咖啡再回来看结果)

资料树结构查询优化(目前查询后可先去喝杯咖啡再回来看结果)

文件树结构查询优化(目前查询后可先去喝杯咖啡再回来看结果)

我使用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) 

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

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

资料树结构查询优化(目前查询后可先去喝杯咖啡再回来看结果)

相关文章:

你感兴趣的文章:

标签云: