想写个特别特别简单的网盘系统? 数据库设计这样可以吗

2020-10-04 22:48:15 +08:00
 zxCoder

没事想写写小项目熟悉一下 go 语言,就想到写一个不像网盘的网盘。。。 需求特别简单。。。就能上传下载文件,把目录,文件列表展示出来就行。 目前想到的数据库表设计是这样的

不考虑其他复杂的情况,这个设计可以吗,求各位大神指点

2327 次点击
所在节点    问与答
11 条回复
cmdOptionKana
2020-10-04 23:37:53 +08:00
假设有一个目录 /工作 /项目 A/重要 /
另外有一个目录 /工作 /项目 B/重要 /

如果你要列出项目 B 的重要文件夹下的全部文件,怎么查询?感觉你现在的结构不太好操作。

可以考虑目录用完整路径,也就是直接把 “/工作 /项目 A/重要 /” 字符串作为目录,不需要父目录。
cmdOptionKana
2020-10-04 23:46:22 +08:00
另外可以考虑增加一个“删除时间”,用来实现垃圾桶功能,也就是说删除时仅标记删除时间,放在垃圾桶里,让用户后悔的机会。(当然,这个功能可以等后面有时间再做,反正先把删除时间安排上,日后想加垃圾桶功能就不需要改表了)

文件类型可以考虑采用 MIME 标准,参考 https://developer.mozilla.org/zh-CN/docs/Glossary/MIME_type

另外,可能还需要 id 和文件名。
Vneix
2020-10-04 23:50:55 +08:00
Akkuman
2020-10-05 00:21:45 +08:00
建议真实文件数据专门加一层抽象出来
zxCoder
2020-10-05 08:51:57 +08:00
@cmdOptionKana
我的目录字段指的就是说完整目录,比如你举得这个例子,我会存

/工作
/工作 /项目 A
/工作 /项目 B
/工作 /项目 A/重要
/工作 /项目 B/重要
/工作 /项目 A/重要 /文件 A.jpg 父目录为 /工作 /项目 A/重要
/工作 /项目 B/重要 /文件 B.jpg 父目录为 /工作 /项目 B/重要

这样子,所以如果我想查项目 B 重要文件夹下的所有文件,我就得全表查父目录为 /工作 /项目 B/重要 的所有项了,好像效率会比较低
zxCoder
2020-10-05 08:52:48 +08:00
@Akkuman 请问可以具体一点吗,不太理解什么意思,是说不要直接存文件实际存放地址吗
love
2020-10-05 09:31:11 +08:00
既然是简单的网盘,为啥不用实际的文件系统呢,根本不需要数据库,直接读文件列表就行了
angryfish
2020-10-05 12:08:02 +08:00
不用想那么多,直接干就是了,做的过程中发现问题再改
zxCoder
2020-10-05 12:21:42 +08:00
@love 好像很有道理。。。 哈哈哈,就当作是没事找事吧
zxCoder
2020-10-05 12:21:57 +08:00
@angryfish 有道理!
baobao1270
2020-10-08 10:41:19 +08:00
可以试试这样设计
int id,
string key,
string sha256

三个字段够了,目录和文件名合并为 key,查找时用 LIKE path% 语句查询 key 前缀即可,然后所有文件都保存在同一目录下并以 sha256 命名,不要带后缀名,形如 /path/to/files/(sha256)。文件的类型可以使用第三方库根据后缀名或文件内容推断,文件类型与大小直接用 fs api 读取,数据库里没必要冗余储存。如果确实需要冗余储存建议上 redis

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/712540

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX