文件权限的嵌套集合或邻接列表模型(MySQL) 问题:
在MySQL数据库中存储所有用户文件/文件夹权限时,应该使用什么设计 细节: 我很难判断嵌套集是否需要太多的插入时间,或者邻接列表是否需要太多的层次数据访问时间。我敢肯定,随着文件/文件夹数量的增加,嵌套集需要花费非常长的时间。例如,插入节点(行)需要更新所遍历节点之后的每个节点。是否可以在路径(即文件权限的嵌套集合或邻接列表模型(MySQL) 问题:,mysql,adjacency-list,nested-set-model,adjacency-list-model,Mysql,Adjacency List,Nested Set Model,Adjacency List Model,在MySQL数据库中存储所有用户文件/文件夹权限时,应该使用什么设计 细节: 我很难判断嵌套集是否需要太多的插入时间,或者邻接列表是否需要太多的层次数据访问时间。我敢肯定,随着文件/文件夹数量的增加,嵌套集需要花费非常长的时间。例如,插入节点(行)需要更新所遍历节点之后的每个节点。是否可以在路径(即/home/user/pictures-->//code>,/home,/home/user)上使用字符串标记,并在查询中使用该标记,这相当于可变长度的邻接列表模型?第三种选择是使用一个父文件夹表,该
/home/user/pictures
-->
//code>,/home
,/home/user
)上使用字符串标记,并在查询中使用该标记,这相当于可变长度的邻接列表模型?第三种选择是使用一个父文件夹
表,该表执行完全相同的功能,但使用更多的空间,而不是更多的时间
以下是文件
和文件夹
表的简要说明:
文件:
CREATE TABLE IF NOT EXISTS files
(
id INT NOT NULL AUTO_INCREMENT,
path VARCHAR(500) NOT NULL,
r BOOL NOT NULL DEFAULT FALSE,
PRIMARY KEY ( id )
)
engine=innodb;
CREATE TABLE IF NOT EXISTS folders
(
id INT NOT NULL AUTO_INCREMENT,
path VARCHAR(500) NOT NULL,
r BOOL NOT NULL DEFAULT FALSE,
PRIMARY KEY ( id )
)
engine=innodb;
CREATE TABLE IF NOT EXISTS files
(
id INT NOT NULL AUTO_INCREMENT,
parent_folder_id INT NOT NULL,
path VARCHAR(500) NOT NULL,
r BOOL NOT NULL DEFAULT FALSE,
FOREIGN KEY ( parent_folder_id ) REFERENCES folder ( id ),
PRIMARY KEY ( id )
)
engine=innodb;
CREATE TABLE IF NOT EXISTS folders
(
id INT NOT NULL AUTO_INCREMENT,
path VARCHAR(500) NOT NULL,
r BOOL NOT NULL DEFAULT FALSE,
PRIMARY KEY ( id )
)
engine=innodb;
CREATE TABLE IF NOT EXISTS parent_folders
(
id INT NOT NULL AUTO_INCREMENT,
parent_folder_id INT NOT NULL,
folder_id INT NOT NULL,
FOREIGN KEY ( parent_folder_id ) REFERENCES folders ( id ),
FOREIGN KEY ( folder_id ) REFERENCES folders ( id ),
PRIMARY KEY ( id )
)
engine=innodb;
文件夹:
CREATE TABLE IF NOT EXISTS files
(
id INT NOT NULL AUTO_INCREMENT,
path VARCHAR(500) NOT NULL,
r BOOL NOT NULL DEFAULT FALSE,
PRIMARY KEY ( id )
)
engine=innodb;
CREATE TABLE IF NOT EXISTS folders
(
id INT NOT NULL AUTO_INCREMENT,
path VARCHAR(500) NOT NULL,
r BOOL NOT NULL DEFAULT FALSE,
PRIMARY KEY ( id )
)
engine=innodb;
CREATE TABLE IF NOT EXISTS files
(
id INT NOT NULL AUTO_INCREMENT,
parent_folder_id INT NOT NULL,
path VARCHAR(500) NOT NULL,
r BOOL NOT NULL DEFAULT FALSE,
FOREIGN KEY ( parent_folder_id ) REFERENCES folder ( id ),
PRIMARY KEY ( id )
)
engine=innodb;
CREATE TABLE IF NOT EXISTS folders
(
id INT NOT NULL AUTO_INCREMENT,
path VARCHAR(500) NOT NULL,
r BOOL NOT NULL DEFAULT FALSE,
PRIMARY KEY ( id )
)
engine=innodb;
CREATE TABLE IF NOT EXISTS parent_folders
(
id INT NOT NULL AUTO_INCREMENT,
parent_folder_id INT NOT NULL,
folder_id INT NOT NULL,
FOREIGN KEY ( parent_folder_id ) REFERENCES folders ( id ),
FOREIGN KEY ( folder_id ) REFERENCES folders ( id ),
PRIMARY KEY ( id )
)
engine=innodb;
以下是上述两个表,已修改,并带有一个潜在的父文件夹
表:
文件:
CREATE TABLE IF NOT EXISTS files
(
id INT NOT NULL AUTO_INCREMENT,
path VARCHAR(500) NOT NULL,
r BOOL NOT NULL DEFAULT FALSE,
PRIMARY KEY ( id )
)
engine=innodb;
CREATE TABLE IF NOT EXISTS folders
(
id INT NOT NULL AUTO_INCREMENT,
path VARCHAR(500) NOT NULL,
r BOOL NOT NULL DEFAULT FALSE,
PRIMARY KEY ( id )
)
engine=innodb;
CREATE TABLE IF NOT EXISTS files
(
id INT NOT NULL AUTO_INCREMENT,
parent_folder_id INT NOT NULL,
path VARCHAR(500) NOT NULL,
r BOOL NOT NULL DEFAULT FALSE,
FOREIGN KEY ( parent_folder_id ) REFERENCES folder ( id ),
PRIMARY KEY ( id )
)
engine=innodb;
CREATE TABLE IF NOT EXISTS folders
(
id INT NOT NULL AUTO_INCREMENT,
path VARCHAR(500) NOT NULL,
r BOOL NOT NULL DEFAULT FALSE,
PRIMARY KEY ( id )
)
engine=innodb;
CREATE TABLE IF NOT EXISTS parent_folders
(
id INT NOT NULL AUTO_INCREMENT,
parent_folder_id INT NOT NULL,
folder_id INT NOT NULL,
FOREIGN KEY ( parent_folder_id ) REFERENCES folders ( id ),
FOREIGN KEY ( folder_id ) REFERENCES folders ( id ),
PRIMARY KEY ( id )
)
engine=innodb;
文件夹:
CREATE TABLE IF NOT EXISTS files
(
id INT NOT NULL AUTO_INCREMENT,
path VARCHAR(500) NOT NULL,
r BOOL NOT NULL DEFAULT FALSE,
PRIMARY KEY ( id )
)
engine=innodb;
CREATE TABLE IF NOT EXISTS folders
(
id INT NOT NULL AUTO_INCREMENT,
path VARCHAR(500) NOT NULL,
r BOOL NOT NULL DEFAULT FALSE,
PRIMARY KEY ( id )
)
engine=innodb;
CREATE TABLE IF NOT EXISTS files
(
id INT NOT NULL AUTO_INCREMENT,
parent_folder_id INT NOT NULL,
path VARCHAR(500) NOT NULL,
r BOOL NOT NULL DEFAULT FALSE,
FOREIGN KEY ( parent_folder_id ) REFERENCES folder ( id ),
PRIMARY KEY ( id )
)
engine=innodb;
CREATE TABLE IF NOT EXISTS folders
(
id INT NOT NULL AUTO_INCREMENT,
path VARCHAR(500) NOT NULL,
r BOOL NOT NULL DEFAULT FALSE,
PRIMARY KEY ( id )
)
engine=innodb;
CREATE TABLE IF NOT EXISTS parent_folders
(
id INT NOT NULL AUTO_INCREMENT,
parent_folder_id INT NOT NULL,
folder_id INT NOT NULL,
FOREIGN KEY ( parent_folder_id ) REFERENCES folders ( id ),
FOREIGN KEY ( folder_id ) REFERENCES folders ( id ),
PRIMARY KEY ( id )
)
engine=innodb;
父文件夹:
CREATE TABLE IF NOT EXISTS files
(
id INT NOT NULL AUTO_INCREMENT,
path VARCHAR(500) NOT NULL,
r BOOL NOT NULL DEFAULT FALSE,
PRIMARY KEY ( id )
)
engine=innodb;
CREATE TABLE IF NOT EXISTS folders
(
id INT NOT NULL AUTO_INCREMENT,
path VARCHAR(500) NOT NULL,
r BOOL NOT NULL DEFAULT FALSE,
PRIMARY KEY ( id )
)
engine=innodb;
CREATE TABLE IF NOT EXISTS files
(
id INT NOT NULL AUTO_INCREMENT,
parent_folder_id INT NOT NULL,
path VARCHAR(500) NOT NULL,
r BOOL NOT NULL DEFAULT FALSE,
FOREIGN KEY ( parent_folder_id ) REFERENCES folder ( id ),
PRIMARY KEY ( id )
)
engine=innodb;
CREATE TABLE IF NOT EXISTS folders
(
id INT NOT NULL AUTO_INCREMENT,
path VARCHAR(500) NOT NULL,
r BOOL NOT NULL DEFAULT FALSE,
PRIMARY KEY ( id )
)
engine=innodb;
CREATE TABLE IF NOT EXISTS parent_folders
(
id INT NOT NULL AUTO_INCREMENT,
parent_folder_id INT NOT NULL,
folder_id INT NOT NULL,
FOREIGN KEY ( parent_folder_id ) REFERENCES folders ( id ),
FOREIGN KEY ( folder_id ) REFERENCES folders ( id ),
PRIMARY KEY ( id )
)
engine=innodb;
还有第三种方法:你研究过吗?@eggyal这不仅仅是存储每一对目录/子目录吗?我想了想,但后来认为它需要太多的行。我想我错了