2

我目前正在用java做一个学校项目,我正在编写一个数据库应用程序。类似于 MySQL Monitor 的东西,您可以在其中输入查询并获取结果/其他内容。

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

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

因此,如果有人知道如何存储数据(比如 CSV?),或者对数据库应用程序如何在内部工作有一定的了解,请您解释一下?

- 编辑:为了更清楚,我不能使用数据库引擎来存储数据,这样说,我正在编写一个简单的数据库引擎。像 Galwegian、jkramer 和 Joe Skora 这样的想法是我正在寻找的。

4

10 回答 10

6

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

所以,是的,看看创建 2 个文件 - 1 个用于存储数据,另一个用于将文件指针存储到该文件中,该文件由您想要提供快速索引访问的任何索引作为键控。

祝你好运——通过我打赌的这个项目,你会学到很多关于数据库构建的知识。

于 2008-09-29T13:17:52.347 回答
3

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

于 2008-09-29T13:12:37.803 回答
3

我不确定我是否理解您的要求,但“ SQLite ”是否适合您(尽管它仍然是一个数据库引擎,这是您可能首先要避免的,所以我不太确定)?

于 2008-09-29T13:13:25.010 回答
3

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

我将为表格定义一个简单的结构:一个描述表格内容的标题,然后是行数据。在表头中定义表中的每一列 - 其名称、数据类型和最大长度。把事情简单化。仅使用 DataInput/OutputStream 的功能作为指导处理少数数据类型。使用简单的文件命名约定将表名与文件名相关联。

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

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

SELECT * FROM EMPLOYEES

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

在您开始工作后,添加其他功能将很简单,例如处理简单的 WHERE 子句,仅返回符合特定条件的行(或行中的列)。

如果不需要这样的通用解决方案(任意数量的表、任意数量的列、实际的查询语言等),您可以简单地将方法添加到您的 API,例如:

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

...或类似的东西。如果你慢慢建立起来,按照我的建议将你的功能分成几个小任务,很快你就会实现你需要的所有功能。

于 2008-09-29T14:14:13.473 回答
2

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

但基本面并不难。将固定长度的列与固定数量的列相结合可以让您非常快速地访问数据库中的任何记录。

从那里开始,一切都是偏移量。

让我们以包含 10 个 32 位整数的简单行为例。单行将是 40 个字节(每个整数 4 个字节 * 10)。如果你想要第 123 行,只需将它乘以 40。123 * 40,给你一个 4920 的偏移量。在数据库文件中寻找那么远,读取 40 个字节,瞧,你的数据库中有一行。

索引存储在 B+-Trees 中,树节点分布在磁盘上的块中。B+Tree 的强大之处在于您可以轻松地在树中找到单个键值,然后简单地遍历叶子节点以键顺序滚动数据。

对于一种有用且流行的简单格式,请考虑查找原始 DBase 格式——DBF 文件。多年来它已经发展了一些,但基础非常简单,有据可查,并且有很多实用程序可以在上面工作。这是一种完美可行的数据库格式,可以处理该问题的所有基本问题。

于 2008-09-29T15:20:26.827 回答
2

我想您可以使用 xml 文件做一个非常简单的原则证明“数据库”应用程序,并可能使用 xpath 来查询它。

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

于 2008-09-29T13:10:19.713 回答
1

如果您使用 C#,您可能会考虑编写一个简单的 linq to xml 类型 ORM。

于 2008-09-29T13:10:21.880 回答
1

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

我希望这就是你的意思。

于 2008-09-29T13:11:38.960 回答
1

您不能使用像hsqldb这样的基于文件的数据库来存储您的用户设置等吗?这样,您就有了熟悉的数据接口,并能够将其存储在文件系统中。

于 2008-09-29T13:14:12.790 回答
-2

StackOverflow 不适用于家庭作业。

话虽如此,这里是一个高效、灵活的数据库的快速而肮脏的方法。

  1. 设计一个漂亮的 Map(HashMap、TreeMap 等)来做你想做的事。通常,您将拥有一个包含数据的“记录”类,以及许多有效Map<String,List<Record>>集合的“索引”对象。(为什么是记录列表?在一个不太选择性的字段上的索引呢?)

  2. 编写一个类来将您的集合序列化为文件。

  3. 编写一个类来反序列化文件中的集合。

  4. 围绕内存中的 Java 对象编写查询处理或任何内容。

内存数据库。

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

“但内存数据库无法扩展,”纯粹主义者抱怨道。用 SQLite 解决这个问题,而不是我。我的电脑有 2GB 的 RAM,这是一个相当大的数据库。SQLite 有效。

于 2008-09-29T14:11:47.177 回答