我目前正在用java编写一个学校项目,并正在编写一个数据库应用程序。类似于MySQL监视器,您可以在其中键入查询并获得结果/任何内容。
在我之前编写的应用程序中,我使用数据库来存储数据,如用户配置文件、设置等。现在,很明显,我不能使用数据库来保存这个学校项目生成的数据,否则有什么意义?
我正在考虑将数据存储在文件中,但这是我现在唯一的想法,我有点累了。。老实说,我不想一开始就乱敲代码,然后我发现了一种更好的方法。
因此,如果有人知道如何存储数据(比如CSV?),或者对数据库应用程序内部的工作方式有一些了解,你能提供一些信息吗?
--EDIT:为了更清楚,我不能使用数据库引擎来存储数据,这样说,我正在编写一个简单的数据库引擎。像Galwegian、jkramer和Joe Skora建议的想法就是我想要的。
当然,您可以使用文件系统创建自己的数据库,因为这就是实际数据库的实现方式。例如,您可以决定将数据存储在固定或可变长度的原始数据文件中,然后创建一个单独的索引文件,其中包含指向另一个文件的文件指针,以便根据您希望存储在索引文件中的索引信息类型快速访问任何查询
因此,是的,考虑创建两个文件——一个用于存储数据,另一个用于将文件指针存储到由您想要提供快速索引访问的任何索引键控的文件中。
祝你好运——我打赌,你会通过这个项目学到很多关于数据库构建的知识。
您可能想要使用的是随机访问文件。一旦您为一条记录设置了一组字段,就可以将它们作为一个块写入磁盘。您可以在内存中的磁盘上单独保存索引,并随时直接访问任何记录。希望这能给你足够的时间开始。
我不确定我是否理解您的需求,但"SQLite"是否适合您(尽管它仍然是一个数据库引擎,这是您可能首先要避免的,所以我不太确定)?
我会创建一个使用二进制表的数据库,每个表一个文件。看看非常方便的DataInputStream和DataOutputStream类。使用它们,您可以轻松地从二进制文件到Java类型来回切换。
我会为表定义一个简单的结构:一个描述表内容的标题,后面跟着行数据。在表头中定义表中的每一列——其名称、数据类型和最大长度。保持简单。仅使用DataInput/OutputStream的功能来处理少数数据类型。使用简单的文件命名约定将表名与文件名关联起来。
创建一个具有足够列的测试表,以便每种数据类型中至少有一种列。然后,通过处理输入文件或通过控制台输入,创建一种简单的方法来用数据填充表。最后,创建一种将整个表的内容显示到控制台的简单方法。
之后,您可以添加一个非常简单的类似SQL的方言版本来进行查询。一个简单的查询如下:
SELECT * FROM EMPLOYEES
将需要打开包含EMPLOYEES表的文件(通过表文件名命名约定),解析标题,并读取整个表,返回内容。
在您完成这项工作后,添加其他功能将非常简单,例如处理简单的WHERE子句,只返回符合某些条件的行(或行中的列)。
如果不需要这样的通用解决方案(任意数量的表、任意数量的列、实际的查询语言等),您可以简单地将方法添加到API中,如:
Employee[] result = EmployeeDataManager.select("LASTNAME", "Smith");
或者类似的东西。如果你慢慢构建,按照我的建议将你的功能划分为几个小任务,很快你就会实现你需要的所有功能。
我想你可以使用xml文件做一个非常简单的原理验证"数据库"应用程序,也许可以使用xpath来查询它
与数据库相比会非常慢(当然取决于文件大小和硬件),但可以工作。
在数据文件中以块形式存储记录的基础知识已经存在了几十年。显然,一个主题有很多变体,所有这些变体都是围绕着我们有慢速磁盘驱动器这一事实设计的。
但基本面并不困难。将固定长度的列与固定数量的列相结合,可以非常快速地访问数据库中的任何记录。
从那里开始,一切都是偏移。
让我们以一个包含10个32位整数的简单行为例。单行将是40个字节(每个整数4个字节*10)。如果您想要第123行,只需将其乘以40即可。123*40,偏移量为4920。在数据库文件中查找,读取40个字节,瞧,您的数据库中有一行。
索引存储在B+树中,树节点分布在磁盘上的各个块中。B+树的强大之处在于,您可以轻松地在树中找到单个键值,然后只需遍历叶节点即可按键顺序滚动数据。
对于一个有用且流行的简单格式,可以考虑查找原始DBase格式——DBF文件。它经过多年的发展,但基础非常简单,有很好的文档记录,而且有很多实用程序可以使用它。这是一种完全可行的数据库格式,可以处理问题的所有基本问题。
如果您使用C#,您可能会考虑编写一个简单的linq到xml类型ORM。
您可以使用像YAML这样的序列化格式,并存储一个哈希数组,其中每个哈希是一个表记录,每个哈希中的键是列名。然后,您可以将序列化的文件加载到内存中,使用数组和散列,然后将所有内容存储回。
我希望这就是你的意思。
你不能使用像hsqldb这样的基于文件的数据库来存储你的用户设置等吗。?这样,您就有了一个熟悉的数据接口,并能够将其存储在文件系统中。
StackOverflow不适合家庭作业。
话虽如此,这里是一个高效、灵活的数据库的快速而肮脏的方法。
-
设计一个漂亮的Map(HashMap、TreeMap,随便什么)来做你想做的事情。通常,您会有一个包含数据的"Record"类,以及许多实际上是
Map<String,List<Record>>
集合的"Index"对象。(为什么是一个记录列表?在一个不太有选择性的字段上建立索引呢?) -
编写一个类,将集合序列化为文件。
-
编写一个类来从文件反序列化集合。
-
围绕内存中的Java对象编写查询处理或其他内容。
内存数据库中。
不喜欢Java的序列化?获取JSON或YAML库,并使用这些格式进行序列化和反序列化。
"但内存数据库无法扩展,"纯粹主义者抱怨道。用SQLite,而不是我。我的电脑有2GB的RAM,这是一个相当大的数据库。SQLite有效。