我使用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节点都可以展开显示我可见的文件(夹)。大家看看该问题如何优化查询?
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节点都可以展开显示我可见的文件(夹)。大家看看该问题如何优化查询?
解决方案 »
- mysql 创建 触发器遇到的问题
- 问一个MySql的查询语句,高手请帮忙>_<
- 求助。。plsql和存储过程
- 怎样设置PostgreSQL中字段和表名对大小写敏感?
- .net调mysql的存储过程出错: Data too long for column '$message' at row 1
- 求mysql中文手册
- MySQL 整除问题??
- 在表中存放树状结构的数据,怎么样才比较好呢?
- 从sqlServer2000查询语句转到mySQL出错,请问如何改! 现场散分!!!
- mysql 函数或过程的性能问题
- 从一个表的数据拷贝到另一个表,需要增加一行数字id,如何实现
- MySQL 字段排序如何按中文首字母排序
什么
层级结构的数据保存在平面的数据库中基本上有两种常用设计方法: 1、毗邻目录模式(adjacency list model) 2、预排序遍历树算法(modified preorder tree traversal algorithm) 都感觉数据量一大,就不行了。你的这个比我做的更复杂。希望能看到高人的文章。。