微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

为什么操作系统Windows、Linux不使用关系数据库RDBMS而不是文件系统?

如何解决为什么操作系统Windows、Linux不使用关系数据库RDBMS而不是文件系统?

我们都知道大多数操作系统都使用文件系统来存储所有数据,但您不认为使用数据库比我们在网站/网络应用中使用的效率更高吗?

解决方法

tl;dr:多样性。


首先,如果您查看原始 FAT 文件系统和原始 Unix 文件系统,它们都是键值存储,它们没有目录层次结构。

其次,this link 表明存在使用 RDBMS 后端实现的文件系统,这与您的问题无关。

话虽如此,将 RDBMS 与作为操作系统存储的文件系统进行比较,使用 RDBMS 有几个缺点:

首先,RDBMS 以牺牲性能为代价,通过锁定的方式做出非常强的保证(ACID)。然而,大多数程序不需要这样的保证(例如,想想每个与 NoSQL DB 一起工作的程序)。相比之下,POSIX 对元数据做出了强而有力的保证,但对 I/O 几乎没有任何保证。您可以在 POSIX 之上构建 RDBMS 并添加锁定,但您不能在 RDBMS 之上构建文件系统并移除锁定。

第二,RDBMS 需要架构。想象一下,您为操作系统创建了一个新的存储卷。您需要决定模式,而不是格式化文件系统。哪种模式最有用?

对于文件系统,“架构”基本上是一个表,包含“路径”、“数据”列,以及每个文件属性(例如修改时间、类型和大小)的列。将此模式使用 RDBMS 允许您以原子方式执行诸如批量截断、批量重命名、批量访问控制等操作。但是,它不允许您同时修改同一记录(文件)的数据。它也不允许您实施硬链接。扩展属性或备用数据流仍然必须按照现在的方式实施,而不是利用 RDBMS 功能以及路径列的特殊索引逻辑,以实现更改目录、列出目录、检查每个目录的权限等功能文件的路径等,以及数据列的特殊逻辑,因为文件的大小可能是 TB。那时,您添加的功能越多,RDBMS 的投资回报率就会下降。

或者,您可以为每个程序设置架构(即每个程序都可以执行 CREATE TABLE 等),但是您的功能再次受到 RDBMS 可以执行的操作的限制。例如,您如何获得 find / -size +1GBmd5sum,甚至 catls 的等价物?这些程序将读取哪些列?您会发现所有通用程序现在都需要采用一组感兴趣的列。它还使编写脚本变得更加困难。

第三,分层系统通常更容易扩展。

一个例子是当您想要添加存储时。在分层文件系统中,即使没有任何花哨的文件系统功能,您也可以简单地将另一个文件系统挂载到目录中,并且您拥有新的存储空间。与增加当前文件系统的存储容量的权衡是硬链接和重命名不能跨文件系统工作,并且它们不共享存储容量。但是,在 RDBMS 上,您的选择是创建一个新表并让您的程序/脚本管理这两个表,或者添加更多存储卷,为此您可能需要执行更高级的操作,例如分区。

另一个例子是生态系统要求。作为一个最终用户想要对他们的 60,000 张图片、5000 首歌曲、数百个工作电子表格、10,000 个模因、数百个电子书、视频等进行排序——这些东西可以方便地按层次排列——你目前只需要两个程序——文件管理器(资源管理器、bash、Nautilus 等)和搜索功能(例如 find(1))。在 RDBMS 上,您要么拥有具有不同列的不同表,要么具有具有通用列的一个表。无论哪种方式,您都必须有一组 SQL 脚本来处理这些特定的集合,这相当于为每种类型的集合拥有一个 shell 脚本或程序。也就是说,管理大型集合需要更多的编程。

因为分层系统在通用上下文(这是主要操作系统运行的上下文)中很有用,并且因为在分层系统之上构建非分层系统比在其他方法(分层文件系统缓存)上更容易甚至让 libsqlfs 的工作更轻松),对于操作系统来说,支持一流的分层系统是很有价值的。


执行摘要:操作系统服务于许多用例,存储访问是其中的主要部分。操作系统构建尽可能最小的存储访问机制是明智的,但这允许应用程序在操作系统之上构建更专业的存储访问机制。

这意味着提供一组小而有用的功能(如权限、锁定、挂载和符号链接),但不要强加太多要求(如锁定或为操作系统指定数据格式)。

RDBMS 太具体了。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。