我使用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节点都可以展开显示我可见的文件(夹)。大家看看该问题如何优化查询?