【发布时间】:2017-01-07 11:56:23
【问题描述】:
我想设计像os文件系统, 可以更新具有特定显示顺序(顺序)的。
我希望文件和文件夹可以在同一层, 文件不必在文件夹中。 但是在下面的设计中,如果文件不在任何文件夹中,我不知道如何保存序列,保存在哪里?
任何建议都会受到重视
数据示例
folder(id:1) top layer: sequence: 0
file(id:1) sequence_in_folder: 0
file(id:2) sequence_in_folder: 1
folder(id:2) top layer: sequence: 1
file(id:3) sequence_in_folder: 0
file(id:4) top layer: sequence: 2 << **sequence save in which table ??**
file(id:5) top layer: sequence: 3 << **sequence save in which table ??**
folder
id sequence parent_folder_id
1 0
2 1
file
id sequence_in_folder folder_id
1 0 1
2 1 1
3 0 2
4 ?????
5 ????
架构
CREATE TABLE IF NOT EXISTS "folder"(
"id" SERIAL NOT NULL,
"sequence" integer NOT NULL,
"parent_folder_id" integer Default NULL,
PRIMARY KEY ("id")
);
CREATE TABLE IF NOT EXISTS "file"(
"id" SERIAL NOT NULL,
"sequence_in_folder" integer Default NULL,
"parent_folder_id" integer NOT NULL,
PRIMARY KEY ("id")
);
更新
基于@Laurenz Albe 的回答,无需更改表格设计,
只需创建一个根文件夹。
但是如何通过两个表中的交叉/存在字段对数据顺序进行排序?
文件夹表和文件表中存在序列,如何排序在一起
查询
SELECT * FROM folder fo
LEFT JOIN file fi ON fi.parent_folder_id = fo.id
WHERE fo.parent_folder_id = $1 AND fi.parent_folder_id = $1
ORDER BY fo.sequence fi.sequence ?? ;
[1]
数据示例
folder
id | sequence | parent_folder_id | name
1 | 0 | | root
2 | 0 | 1 |
3 | 2 | 1 |
file
id | sequence | parent_folder_id |
1 | 1 | 1 |
输出
folder(id:1, sequence:0 name:root)
folder(id:2, sequence:0)
file(id:1, sequence:1)
folder(id:3 sequence:2)
【问题讨论】:
-
序列有什么问题?
-
@ChrisTravers 这个设计似乎只适用于
bookmark必须在bookmark_folder中 bookmark.sequence = 特定文件夹中的序列
标签: database postgresql database-design relational-database