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