问题:
在 MySQL 数据库中存储所有用户文件/文件夹权限时应该使用什么设计?
细节:
我无法确定嵌套集是否需要太多插入时间,或者邻接列表是否需要太多访问分层数据的时间。我很确定随着文件/文件夹数量的增加,嵌套集会花费很长时间。例如,插入一个节点(行)需要在遍历该节点之后更新每个单个节点。是否可以在路径上使用字符串标记化(即/home/user/pictures
-->
/
, /home
, /home/user
)并在查询中使用它,相当于可变长度邻接列表模型?第三种选择是拥有一个parent_folders
执行完全相同功能但使用更多空间而不是更多时间的表。
以下是对files
和folders
表的简要描述:
文件:
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;
这是上面的两个表,经过修改并带有潜在parent_folders
表:
文件:
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;