簡體   English   中英

將數據庫數據存儲在文件中?

[英]Storing database data in files?

我目前正在研究java中的學校項目,我正在編寫數據庫應用程序。 類似於MySQL監視器,您可以在其中輸入查詢並獲得結果/等等。

在我之前編寫的應用程序中,我使用數據庫來存儲數據,例如用戶配置文件,設置等。現在,顯然,我不能使用數據庫來存儲從這個學校項目生成的數據,否則有什么意義呢?

我正在考慮將數據存儲在文件中,但這是我現在腦海中唯一的想法,而且我有點干嘛...說實話,我不想開始敲打代碼然后我發現這樣做的更好方法。

因此,如果有人知道如何存儲數據(如CSV?),或者對數據庫應用程序如何在內部工作有一些知識,請你解釋一下嗎?

- 編輯:為了更清楚,我不能使用數據庫引擎來存儲數據,就這樣說,我編寫了一個簡單的數據庫引擎。 像Galwegian,jkramer和Joe Skora所建議的想法正是我在尋找的。

當然,您可以使用文件系統創建自己的數據庫,因為這是實際數據庫的實現方式。 例如,您可以決定將數據存儲在固定或可變長度的原始數據文件中,然后創建一個單獨的索引文件,其中包含指向該另一個文件的文件指針,以便根據您希望存儲的索引信息類型對任何查詢進行快速索引訪問在您的索引文件中

所以是的,看看創建2個文件 - 1用於存儲數據,另一個用於將文件指針存儲到該文件中,該文件由您希望提供快速索引訪問的任何索引鍵入。

祝您好運 - 您將通過我投注的這個項目來學習很多關於數據庫構建的知識。

你可能想要的是使用隨機訪問文件 為記錄創建一組字段后,可以將它們作為塊寫入磁盤。 您可以將索引分別保存在內存中的磁盤上,並可以隨時直接訪問任何記錄。 希望這足以讓你開始。

我不確定我理解你的要求,但不會' 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 + -Trees中,樹節點分布在磁盤上的塊中。 B + Tree的強大之處在於您可以輕松地在樹中找到單個鍵值,然后簡單地遍歷葉節點以按鍵順序滾動數據。

對於一個有用且流行的簡單格式,請考慮查找原始DBase格式--DBF文件。 多年來它已經發展了一些,但基礎非常簡單,文檔齊全,並且有許多實用程序可以使用它。 這是一個完美可行的數據庫格式,可以處理問題的所有基本問題。

如果您正在使用C#,您可以考慮將簡單的linq編寫為xml類型的ORM。

您可以使用像YAML這樣的序列化格式,並存儲哈希數組,其中每個哈希都是一個表記錄,每個哈希中的鍵都是列名。 然后,您可以將序列化文件加載到內存中,使用數組和散列,然后將所有內容存儲回來。

我希望這就是你的意思。

你不能使用像hsqldb這樣的基於文件的數據庫來存儲你的用戶設置等嗎? 這樣,您就擁有了熟悉的數據接口,並能夠將其存儲在文件系統中。

StackOverflow不適用於家庭作業。

話雖如此,這是一個高效,靈活的數據庫的快速和骯臟的方式。

  1. 設計一個很好的Map(HashMap,TreeMap,無論如何)來完成你想做的事情。 通常,您將擁有一個包含數據的“Record”類,以及一些有效的Map<String,List<Record>>集合的“Index”對象。 (為什么是一個記錄列表?關於非選擇性字段的索引怎么樣?)

  2. 編寫一個類來將您的集合序列化為文件。

  3. 編寫一個類來從文件中反序列化集合。

  4. 在內存中的Java對象周圍編寫查詢處理或其他內容。

內存數據庫。

不喜歡Java的序列化? 獲取JSON或YAML庫並使用這些格式進行序列化和反序列化。

“但內存數據庫無法擴展,”純粹主義者抱怨道。 用SQLite來解決這個問題,而不是我。 我的電腦有2GB的RAM,這是一個非常大的數據庫。 SQLite有效。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM