2

私は現在、Java で学校のプロジェクトに取り組んでおり、データベース アプリケーションをコーディングしています。クエリを入力して結果を取得するMySQLモニターのようなもの。

以前コーディングしたアプリケーションでは、ユーザー プロファイルや設定などのデータを格納するためにデータベースを使用していました。もちろん、この学校のプロジェクトから生成されたデータを格納するためにデータベースを使用することはできません。そうしなければ意味がありません。

データをファイルに保存することを考えていますが、それが今頭にある唯一のアイデアで、ちょっと枯渇しています..正直に言うと、コードを叩き始めたくはありません。それを行うためのより良い方法。

データを保存する方法 (CSV など) を知っている人、またはデータベース アプリケーションが内部でどのように機能するかについて何らかの知識を持っている人がいる場合は、光を当てることができますか?

-- 編集: より明確にするために、データベース エンジンを使用してデータを保存することはできません。このように言えば、単純なデータベース エンジンをコーディングしています。Galwegian、jkramer、Joe Skora が提案したようなアイデアは、私が探しているものです。

4

10 に答える 10

6

確かに、実際のデータベースはそのように実装されているため、ファイル システムを使用して独自のデータベースを作成することもできます。たとえば、データを固定長または可変長の生データ ファイルに保存し、別のファイルへのファイル ポインターを含む別のインデックス ファイルを作成して、保存するインデックス情報の種類に基づいてクエリのインデックス付きアクセスをすばやく行うことができます。あなたのインデックスファイルに

そうです、2 つのファイルを作成することを検討してください。

幸運を祈ります。このプロジェクトで、データベースの構築について多くのことを学ぶことができると思います。

于 2008-09-29T13:17:52.347 に答える
3

テーブルごとに 1 つのファイルで、バイナリ テーブルを使用するデータベースを作成します。非常に便利な DataInputStream および DataOutputStream クラスを見てください。それらを使用すると、バイナリ ファイルと Java 型を簡単に行き来できます。

テーブルの単純な構造を定義します。テーブルの内容を説明するヘッダーと、それに続く行データです。テーブルの各列をヘッダーで定義します - その名前、データ型、および最大長。複雑にしないでおく。ガイドとして DataInput/OutputStream の機能を使用して、いくつかのデータ型のみを処理します。単純なファイル命名規則を使用して、テーブル名をファイル名に関連付けます。

各データ型を少なくとも 1 つ持つのに十分な数の列を含むテスト テーブルを作成します。次に、入力ファイルを処理するか、コンソール入力を介して、テーブルにデータを入力する簡単な方法を作成します。最後に、テーブル全体の内容をコンソールに表示する簡単な方法を作成します。

その後、非常に単純なバージョンの SQL に似た方言を追加して、クエリを実行できます。次のような単純なクエリ:

SELECT * FROM EMPLOYEES

... EMPLOYEES テーブルを含むファイルを (テーブル ファイル名の命名規則に従って) 開き、ヘッダーを解析し、テーブル全体を読み取って内容を返す必要があります。

それが機能するようになったら、単純な WHERE 句の処理などの他の機能を簡単に追加して、特定の基準に一致する行 (または行内の列) のみを返すことができます。

このような汎用ソリューション (任意の数のテーブル、任意の数の列、実際のクエリ言語など) が必要ない場合は、次のように API にメソッドを追加するだけです。

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

……とか、そんなこと。私が提案したように、機能をいくつかの小さなタスクに分割してゆっくりと構築すると、すぐに必要な機能がすべて実装されます。

于 2008-09-29T14:14:13.473 に答える
3

おそらく使用したいのは、ランダム アクセス ファイルです。レコードの一連のフィールドを取得したら、それらをブロックとしてディスクに書き込むことができます。メモリ内のディスク上にインデックスを個別に保持し、いつでも任意のレコードに直接アクセスできます。うまくいけば、それで始めるのに十分です。

于 2008-09-29T13:12:37.803 に答える
3

私はあなたの要件を理解しているかどうか確信が持てませんが、' SQLite ' がうまくいかないでしょうか?

于 2008-09-29T13:13:25.010 に答える
2

レコードをデータ ファイルのブロックに格納する基本は、何十年も前から存在しています。明らかに、テーマには非常に多くのバリエーションがあり、それらはすべて、低速のディスク ドライブを使用しているという事実を回避するように設計されています。

しかし、基本は難しくありません。固定長の列と固定数の列を組み合わせると、データベース内の任意のレコードに非常に高速にアクセスできます。

そこから、それはすべてオフセットです。

10 個の 32 ビット整数を含む単純な行の例を見てみましょう。1 つの行は 40 バイトになります (整数あたり 4 バイト * 10)。行 123 が必要な場合は、単純に 40 を掛けます。123 * 40 は、4920 のオフセットを提供します。データベース ファイルをさらに探して、40 バイトを読み取ると、データベースから行が得られます。

インデックスは B+-Tree に格納され、ツリー ノードはディスク上のブロック全体に分散されます。B+Tree の利点は、ツリー内で 1 つのキー値を簡単に見つけて、リーフ ノードをたどってデータをキー順にスクロールできることです。

便利で人気のある単純な形式については、元の 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. やりたいことを実行する素敵なマップ (HashMap、TreeMap など) を設計します。Map<String,List<Record>>多くの場合、データを含む "Record" クラスと、実質的にコレクションである多数の "Index" オブジェクトがあります。(なぜレコードのリストなのですか?あまり選択的でないフィールドのインデックスはどうですか?)

  2. コレクションをファイルにシリアル化するクラスを作成します。

  3. ファイルからコレクションを逆シリアル化するクラスを作成します。

  4. インメモリ Java オブジェクトに関するクエリ処理などを記述します。

インメモリ データベース。

Java のシリアル化が気に入らない? JSON または YAML ライブラリを取得し、それらの形式を使用してシリアル化および逆シリアル化します。

「しかし、インメモリ データベースは拡張できません」と、純粋主義者は泣き言を言います。私ではなく、SQLiteでそれを取り上げてください。私の PC には 2GB の RAM があり、これはかなり大きなデータベースです。SQLite が動作します。

于 2008-09-29T14:11:47.177 に答える