将数据库数据存储在文件中?

时间:2020-03-06 14:52:22  来源:igfitidea点击:

我目前正在使用Java进行学校项目,并且正在编写数据库应用程序。诸如MySQL Monitor之类的东西,我们可以在其中键入查询并获取结果。

在我之前编写的应用程序中,我使用数据库来存储数据,例如用户配置文件,设置等。现在,很明显,我不能使用数据库来存储从该学校项目生成的数据,否则有什么意义呢?

我正在考虑将数据存储在文件中,但这是我目前脑海中唯一的想法,而且我有点干..老实说,我不想开始猛烈地敲打代码,然后我发现一种更好的方法。

因此,如果有人对如何存储数据有任何想法(例如CSV?),或者对数据库应用程序在内部如何工作有某种了解,可以请我们阐明一下吗?

--
编辑:为了更清楚一点,我不能使用数据库引擎来存储数据,以这种方式,我正在编写一个简单的数据库引擎。我正在寻找Galwegian,jkramer和Joe Skora等人提出的想法。

解决方案

我想我们可以使用xml文件做一个非常简单的原理"数据库"应用程序证明,也许可以使用xpath来查询它。

与数据库相比,它会非常慢(当然取决于文件大小和硬件),但是可以工作。

如果我们使用的是C#,则可以考虑将简单的linq写入xml类型的ORM。

我们可以使用YAML之类的序列化格式,并存储一个哈希数组,其中每个哈希是一个表记录,每个哈希中的键是列名。然后,我们可以只将序列化的文件加载到内存中,使用数组和哈希,然后将所有内容存储回去。

我希望那是你的意思。

我们可能想要使用的是随机访问文件。一旦具有一组记录字段,就可以将它们作为块写入磁盘。我们可以将索引单独保存在内存中的磁盘上,并可以随时直接访问任何记录。希望这能给我们足够的入门。

我不确定我是否理解要求,但是" SQLite"对我们不起作用(尽管它仍然是数据库引擎,我们一开始可能会避免这样做,所以我不确定)。

我们不能使用基于文件的数据库(例如hsqldb)来存储用户设置等吗?
这样,我们就拥有了一个熟悉的数据界面,并且能够将其存储在文件系统中。

当然,我们可以使用文件系统创建自己的数据库,因为这是实现实际数据库的方式。例如,我们可以决定将数据存储在固定长度或者可变长度的原始数据文件中,然后创建一个单独的带有文件指针的索引文件到另一个文件中,以便根据要存储的索引信息的类型对任何查询进行快速索引访问在索引文件中

因此,是的,请看创建2个文件,一个用于存储数据,另一个用于将文件指针存储到该文件中,该文件由我们想要提供快速索引访问的索引所键控。

祝我们好运,我将通过这个项目来学习很多有关数据库构建的知识。

StackOverflow不适合家庭作业。

话虽如此,这是高效而灵活的数据库的快速和肮脏方式。

  • 设计一个不错的地图(HashMap,TreeMap等),该地图可以完成我们想做的事情。通常,数据会带有一个" Record"类,以及许多实际上是" Map <String,List <Record >>"集合的" Index"对象。 (为什么要有一个记录列表?在一个非选择性字段上的索引又如何呢?)
  • 编写一个类以将集合序列化为文件。
  • 编写一个类以反序列化文件中的集合。
  • 围绕内存Java对象编写查询处理或者其他内容。

内存数据库。

不喜欢Java的序列化吗?获取JSON或者YAML库,并使用这些格式进行序列化和反序列化。

纯粹主义者抱怨道:"但是内存数据库无法扩展。"用SQLite来解决这个问题,而不是我。我的电脑有2GB的RAM,这是一个很大的数据库。 SQLite可以工作。

我将创建一个使用二进制表的数据库,每个表一个文件。看一下非常方便的DataInputStream和DataOutputStream类。使用它们,我们可以轻松地从二进制文件到Java类型来回切换。

我将为表定义一个简单的结构:标头,描述表的内容,后跟行数据。在标题中定义的表中的每一列均具有其名称,数据类型和最大长度。把事情简单化。仅使用DataInput / OutputStream的功能来处理几种数据类型。使用简单的文件命名约定将表名与文件名关联。

创建一个具有足够多列的测试表,以使每种数据类型至少具有一个。然后,通过处理输入文件或者通过控制台输入,创建一种简单的方法来用数据填充表。最后,创建一种简单的方法来向控制台显示整个表的内容。

之后,我们可以添加一个非常简单的类似SQL的方言版本来进行查询。像这样的简单查询:

SELECT * FROM EMPLOYEES

...将需要打开包含EMPLOYEES表的文件(通过表文件名命名约定),解析标题,并通读整个表,返回内容。

完成该工作后,将很容易添加其他功能,例如处理简单的WHERE子句,仅返回与某些条件匹配的行(或者行中的列)。

如果没有必要使用这样的通用解决方案(任意数量的表,任意数量的列,实际的查询语言等),则可以简单地向API添加方法,例如:

Employee[] result = EmployeeDataManager.select("LASTNAME", "Smith");

...或者类似的东西。如果构建缓慢,按照我的建议将功能分为几个小任务,很快我们将实现所需的所有功能。

在数据文件的块中存储记录的基础已有数十年的历史了。显然,一个主题有很多变体,所有这些变体都是为了解决磁盘驱动器速度慢这一事实而设计的。

但是基本原理并不困难。将固定长度的列与固定的列数结合在一起可以使我们非常快速地访问数据库中的任何记录。

从那里开始,所有的偏移量。

让我们以包含10个32位整数的简单行为例。单行将是40个字节(每个整数4个字节* 10)。如果要行123,只需将其乘以40。123 * 40,偏移量为4920。向数据库文件中查找该行,读取40字节,瞧,数据库中有一行。

索引存储在B +树中,树节点分布在磁盘上的各个块中。 B + Tree的功能在于,我们可以轻松地在树中找到单个键值,然后只需遍历叶节点即可按键顺序滚动浏览数据。

对于有用且流行的简单格式,请考虑查找原始DBase格式-DBF文件。它经过多年的发展,但是其基础非常简单,文档齐全,并且有很多实用程序可以使用。这是一种完美可行的数据库格式,可以处理所有与该问题有关的基本问题。