V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
dream4ever
V2EX  ›  Web Dev

PDF 试卷资源管理方案设计

  •  
  •   dream4ever · 2021-01-04 11:39:10 +08:00 · 2414 次点击
    这是一个创建于 1411 天前的主题,其中的信息可能已经有所发展或是发生改变。

    最近在做一项业务,面向中小学生提供在线查看的试卷资源,试卷全部为 PDF 文件。为了方便及规范管理,每份试卷会在数据库中生成一个唯一标识,标识里会记录下面这些信息:

    • 对应教材版本,如人教版为 1 、XX 版为 2
    • 对应学科,如语文为 1 、数学为 2 、英语为 3
    • 对应年级,小学一年级为 1 、二年级为 2
    • 对应学期,上学期为 1,下学期为 2
    • 对应单元,期中为 98,期末为 99
    • 试卷编号,对应到以上各级别分类之后,在所属分类下的试卷编号,暂定 0001 ~ 0009

    最终某份试卷的唯一标识就会是 2112010001 这种形式,这样不管是我们这边进行管理,还是用户反馈试卷上的各种问题,都可以通过这个唯一标识迅速找到目标试卷。

    试卷物理文件的存储,目前不考虑收费的 OSS 之类的方案,打算直接存放在阿里云服务器的磁盘上。

    第一个问题,就是存放 PDF 物理文件的目录结构的设计,有什么好的方案可以参考么?比如根据教材版本、学科、年级等信息,放到对应的文件夹下,这样单个文件夹内的文件数量不会太多。

    第二个问题就是 PDF 文件的版本控制,因为即使在发布试卷资源之前做了各种检查,也难免会有疏漏,后续还需要不断地对有问题的试卷进行修改,没有版本控制很容易一团糟。对于 PDF 这种文件,有什么合适的版本控制方案么?还是说直接 git-lfs 就可以?

    3 条回复    2021-01-04 17:29:49 +08:00
    jucelin
        1
    jucelin  
       2021-01-04 11:47:22 +08:00
    这种可视化管理,其实是线下图书馆的管理思路。
    如果换成线上,可以把纬度(教材版本、学科等)全部维护成一个字段,以后拓展查询都方便。
    另外,这中有规律的命名文件名,不怕没爬吗
    dream4ever
        2
    dream4ever  
    OP
       2021-01-04 12:28:03 +08:00
    @jucelin 嗯,是有考虑把不同维度的数据分别存在不同的字段里,提升可扩展性。

    至于唯一标识,可能我没说清楚,并不是物理文件的文件名,而是数据库一张表的一条记录中的"id",用来唯一对应一份试卷。不过这么有规律,的确太容易被爬了,是得考虑这方面的反制措施,多谢建议。
    baobao1270
        3
    baobao1270  
       2021-01-04 17:29:49 +08:00
    1 、同 #1,这些数据作为字段,前端可以提供筛选工具让用户进行筛选
    2 、考虑如下数据库结构:
    试卷表{
    id 主键 INT 自增或 GUID
    年级
    教材
    学期
    ……
    }

    试卷版本表{
    id 主键 INT 自增或 GUID
    试卷_id 外键:试卷表.id
    修改时间
    ……
    sha1
    }

    3 、即:试卷版本与试卷存在多对一关系,数据库仅仅保存试卷 PDF 文件的 SHA-1 值。
    4 、物理储存上,将所有 PDF 存在同一个文件夹下。形如 "/var/path/to/pdf/" + sha1 + ".pdf"。
    5 、试卷标题可存储在数据库中,并通过 HTTP 的 filename 设置。这样用户下载时,浏览器可以自动重命名为正确的文件名,而非 SHA1 值。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   4987 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 51ms · UTC 05:40 · PVG 13:40 · LAX 21:40 · JFK 00:40
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.