最近在做一项业务,面向中小学生提供在线查看的试卷资源,试卷全部为 PDF 文件。为了方便及规范管理,每份试卷会在数据库中生成一个唯一标识,标识里会记录下面这些信息:
最终某份试卷的唯一标识就会是 2112010001 这种形式,这样不管是我们这边进行管理,还是用户反馈试卷上的各种问题,都可以通过这个唯一标识迅速找到目标试卷。
试卷物理文件的存储,目前不考虑收费的 OSS 之类的方案,打算直接存放在阿里云服务器的磁盘上。
第一个问题,就是存放 PDF 物理文件的目录结构的设计,有什么好的方案可以参考么?比如根据教材版本、学科、年级等信息,放到对应的文件夹下,这样单个文件夹内的文件数量不会太多。
第二个问题就是 PDF 文件的版本控制,因为即使在发布试卷资源之前做了各种检查,也难免会有疏漏,后续还需要不断地对有问题的试卷进行修改,没有版本控制很容易一团糟。对于 PDF 这种文件,有什么合适的版本控制方案么?还是说直接 git-lfs 就可以?
1
jucelin 2021-01-04 11:47:22 +08:00
这种可视化管理,其实是线下图书馆的管理思路。
如果换成线上,可以把纬度(教材版本、学科等)全部维护成一个字段,以后拓展查询都方便。 另外,这中有规律的命名文件名,不怕没爬吗 |
2
dream4ever OP @jucelin 嗯,是有考虑把不同维度的数据分别存在不同的字段里,提升可扩展性。
至于唯一标识,可能我没说清楚,并不是物理文件的文件名,而是数据库一张表的一条记录中的"id",用来唯一对应一份试卷。不过这么有规律,的确太容易被爬了,是得考虑这方面的反制措施,多谢建议。 |
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 值。 |