我是一名本科生,还没有使用过任何实际的数据库,所以如果我误解/误用任何术语,我深表歉意。我的问题来自我的一项作业,但这是我学习的尝试,而不是让我做作业。
任务,解释一下:
某大学的打印服务允许校园内的学生将文件上传到系统,并将上传的文件发送到大学的一台打印机进行打印...系统记录所有学生完成的所有打印,记录学生的 ID、使用哪台打印机、打印文件的名称以及打印时间。系统管理员应该能够查看过滤到任何学生、打印机和/或时间段的日志文件(据我所知,这需要索引)。
我遇到的一个问题是我应该使用哪种数据存储方法(数据库或文件系统)来存储学生的文件和日志文件,这两者都是频繁增长的数据。
从这个SO问题我了解到,频繁更新的文件最好存储为文件系统存储,并且从这个问题可以将文件存储在带有blob的数据库中。
我的问题是:
- 日志文件应该存储在数据库还是文件系统中?(或者我认为决定性的问题是“是否可以在不建立索引的情况下按多个值进行过滤?”)
- 如果学生文件与数据库表中与学生相关的 blob 一起存储,是否每个学生只能访问自己的文件?
- 为什么文件系统更适合频繁增长的文件?
- 服务器是否可能(或实用)同时使用数据库和文件系统?
基于以下主要关注点
您应该将数据存储在数据库中。当然,使用文件的日志效率更高,但是存储在数据库中的日志更容易读取和维护,并且似乎您需要阅读很多内容。
如果您没有打印机的描述或保留有关学生的信息,则两个表就足够了(在您的问题中提到只需要学生 ID、打印机 ID、日期和打印描述)。
以下示例基于 MySQL(不同 DBMS 的语法可能有所不同)
printed
桌子printed_details
桌子有了适当的索引,速度就不会成为问题。
查看日志的“过滤”方面强烈表明了数据库解决方案。
“理解”存储的记录格式并提取您感兴趣的位的所有复杂性都由您的数据库处理。将其放入文件中,您必须重新发明所有工作。
此外,将数据保留在数据库中可以让您更好地对其进行安全控制。一旦它“存在”到文件中,保证数据安全就变得更加困难。
是的。“行级安全性”是对此的常用术语。
但是,恕我直言,您的学生根本不应该访问数据库。他们用来查看内容的应用程序 应该使用单独的(即秘密的)服务帐户。最终用户不应在数据库内拥有自己的[数据库]帐户。
简而言之,这就是文件系统的构建目的。
DBMS 的构建目的是将新记录写入表中,但是如何扩展现有行中的值呢?没那么多。
是的,但没有必要。
但是,无论您如何存储这些数据,请记住,除非您为其进行一些内部管理,否则它只会增长。
有人真的会关心七年半前那个人“X”打印出的文档“Y”吗?这不太可能,因此您需要制定流程来销毁您真正不再需要的数据(或者[合法]不再需要/允许保留 - 如果这是任何类型的“,请参阅“GDPR ” )给你惊喜”)。