V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
V2EX 提问指南
zxCoder
V2EX  ›  问与答

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

  •  
  •   zxCoder · 2020-10-04 22:48:15 +08:00 · 2302 次点击
    这是一个创建于 1271 天前的主题,其中的信息可能已经有所发展或是发生改变。

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

    • 目录(比如 /ppt 这样)
    • 类型(文件 /目录)
    • 父目录
    • 创建时间
    • 最近修改时间
    • 文件类型(若是文件,比如文本,图片,视频)
    • 文件大小(若是文件)
    • 文件 md5(若是文件)
    • 文件实际存放位置(若是文件)

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

    11 条回复    2020-10-08 10:41:19 +08:00
    cmdOptionKana
        1
    cmdOptionKana  
       2020-10-04 23:37:53 +08:00
    假设有一个目录 /工作 /项目 A/重要 /
    另外有一个目录 /工作 /项目 B/重要 /

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

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

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

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

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

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

    三个字段够了,目录和文件名合并为 key,查找时用 LIKE path% 语句查询 key 前缀即可,然后所有文件都保存在同一目录下并以 sha256 命名,不要带后缀名,形如 /path/to/files/(sha256)。文件的类型可以使用第三方库根据后缀名或文件内容推断,文件类型与大小直接用 fs api 读取,数据库里没必要冗余储存。如果确实需要冗余储存建议上 redis
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   2325 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 25ms · UTC 00:02 · PVG 08:02 · LAX 17:02 · JFK 20:02
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.