什么是平面文件?

Gir*_*ara 0 linux filesystems files

它是纯文本文件还是二进制文件还是只是字符文件?有人可以解释平面文件的实际含义吗?

Jde*_*eBP 9

dirkt 询问上下文是正确的,但对于不是数据库或包含记录的平面文件是非常错误的。

平面文件数据库

在数据库上下文中,平面文件数据库满足以下条件:

  • 它是一个数据库,在一个文件中只包含一个表。
  • 该表没有索引。
  • 该结构不是相关的、分层的或网络化的。
  • 该文件可以包括固定长度的记录,字段由列位置表示,或者可变长度的记录,记录和字段由分隔符分隔开。

在讨论这个问题时,人们可能会遇到诸如基本顺序访问方法 (BSAM) 和排队顺序访问方法 (QSAM) 之类的术语。这与访问平面文件数据库的方式有关。人们必须线性和顺序地读取和写入它们,因为该概念不需要对记录进行排序甚至键控。

插入和删除涉及处理整个文件。平面文件数据库过去通常存储在适合顺序访问的介质上,例如磁带,并且数据库更新有时会采用从输入磁带 A 和 B 中读取并合并到输出磁带 C 的形式。(例如:A可能是今天开始的主文件,B 可能是今天的交易,而 C 可能是明天运行的主文件。)

日常平面文件数据库

你可能会认为你不会再遇到这样的事情,或者至少你不会在 Unix 和 Linux 上遇到它们。你也大错特错。以下是您每天都会遇到的一些平面文件数据库:

  • Linux 上的用户帐户数据库是平面文件的集合。
    • 版本 7/etc/passwd文件是一个单表,具有可变长度的记录,冒号字符作为字段分隔符,换行符作为记录分隔符。
    • 因此,同样是/etc/group/etc/shadow/etc/gshadow
  • /etc/fstab文件是一个单表,具有可变长度的记录,非换行空白字符作为字段分隔符,换行作为记录分隔符。文件系统- 它在名称中。
    • 因此,同样是/etc/services/etc/crontab/etc/phones/etc/ttys/etc/hosts,和/etc/protocols
  • 登录数据库(/run/utmp/var/log/wtmpLinux上; /run/utx.active/var/log/utx.lastlogin,和/var/log/utx.log。在FreeBSD等人)是具有固定长度的记录,没有场也不记录分隔符和字段通过柱位置表示平面文件数据库。

您可能认为您不会读入整个文件,然后将整个文件重新写回,以便在上述可变长度记录数据库中执行记录的插入和删除。您移动光标并执行行删除和插入操作。但是您忽略了整个文件 I/O 正是您的文本编辑器本身加载和保存文件时实际执行的操作。文件本身的实际访问方法是平面文件数据库。

非平面文件的日常数据库

当人们想要顺序访问以外的其他东西时,这些平面文件数据库就是平面文件数据库性能不佳的例子。在 中查找主机/etc/hosts或在 中查找用户帐户/etc/passwd涉及顺序读取文件。没有索引,条目也没有按照用于搜索的键的顺序排序。看看用来搜索这些平面文件数据库的C库函数(如gethostent()getpwent()getfsent()getgrent(),和getutxent()),并与一个例外,我们会得到在短短的一瞬间,你会看到顺序访问方法。(各种getXbyY()例程建立在这些之上。它们只是调用顺序访问例程,直到找到匹配项,您就会找到。)

因此,在 BSD 上,实际的用户帐户数据库不是平面文件数据库。它们是 Berkeley DB 文件,按 UID 和用户名进行索引。它们是由程序从存储在 中的平面文件数据库编译/etc/master.passwdpwd_mkdb。C 库实际上读取/etc/pwd.dbor (如果可以的话)/etc/spwd.db

BSD的“性能数据库”源文件结构,你会在这样的人找到/etc/gettytab/etc/login.conf/etc/termcap,是不是一个真正的平面文件。(在/etc/login.conf.db和 中找到的编译文件结构,/etc/termcap.db绝对不是。)记录可以通过引用包含其他记录,形成必须遵循的链,以便找到给定记录的所有字段。事实上,编译器 ,cap_mkdb就是这样做的。

平面文件不是“ASCII 文本”

ASCII 为文件、组、记录和单元(即字段)分隔符定义了特定的控制字符。它们主要在 Unices 和 Linux 上未使用,有利于像空格TABLF、 和冒号这样的字符。

人们有时会说“平面文件数据库包含简单的 ASCII 文本”。从上面给出的一些例子应该可以清楚地看出,事实并非如此。这仅适用于一种特定的常见类型的可变长度记录平面文件数据库。然而,在您的 Unix 或 Linux 系统上同样广泛使用的登录数据库也是一个平面文件数据库,但其中各种字段绝对不会被解释为 ASCII 字符编码。

(从更广阔的世界来看,当人们抛弃 Unix/Linux 隧道愿景时:这是一种误解,因为 xBase 将用 ASCII 编码的字段内容存储在dbf文件中的事实有所帮助。人们过去常常谈论 xBase,曾经被吹捧为世界上最流行的数据库系统,作为“平面文件”系统,尽管他们实际上使用该术语与“关系”或“面向对象”相对立,并以人们滥用“遗留”的方式误用它“旧”。因此“平面文件”系统“使用 ASCII”。但这甚至不是真的。 dbf文件有很多东西,同样,绝对不能解释为 ASCII 字符编码。)

进一步阅读

  • 唐纳德·K·伯利森 (1998)。在数据库对象模型里面。CRC 出版社。国际标准书号 9780849318078。
  • 罗布·马蒂森 (1998)。了解数据库管理系统。麦格劳-希尔。ISBN 9780070499997。