9

java.util.UUIDを使用して作成した UUID を HSQLDB データベースに保存したいと考えています。

明らかなオプションは、それらを単純に文字列として格納することです (コードでは、おそらくそのように扱われます)、つまり varchar(36) です。

データベースのサイズやクエリの速度などの問題を考慮して、これについて他にどのようなオプションを検討する必要がありますか (どちらも関連するデータの量のために大きな懸念事項ではありませんが、少なくともそれらを検討したいと思います)

4

5 に答える 5

9

いくつかのオプションがあります:

  • すでに提案したように、VARCHAR(36) として保存します。これは、オーバーヘッドを除いて、UUID ごとに 36 バイト (288 ビット) のストレージを必要とします。
  • 各 UUID を 2 つの BIGINT 列に格納します。1 つは最下位ビット用で、もう 1 つは最上位ビット用です。UUID#getLeastSignificantBits()UUID#getMostSignificantBits()を使用して各部分を取得し、適切に保存します。これには、UUID ごとに 128 ビットのストレージが必要であり、オーバーヘッドはカウントされません。
  • 各 UUID を OBJECT として保存します。これにより、UUID クラスのバイナリ シリアル化バージョンとして格納されます。これがどれだけのスペースを占めるかはわかりません。Java UUID のデフォルトのシリアル化された形式が何であるかを確認するには、テストを実行する必要があります。

各アプローチの長所と短所は、アプリで UUID を渡す方法に基づいています。それらを文字列に相当するものとして渡す場合、VARCHAR(36) のストレージ容量が 2 倍必要になるという欠点があります。 DB クエリまたは更新を行うたびにそれらを変換する必要がないという点で、このアプローチはおそらく重要です。それらをネイティブ UUID として渡している場合、BIGINT メソッドはおそらくオーバーヘッドがかなり低いでしょう。

ああ、速度とストレージ容量の問題を検討しているのは素晴らしいことですが、私よりも多くの人が言っているように、アプリが保存するデータの量を考えると、これらはそれほど重要ではない可能性があることを認識するのも良いことですと維持しています。いつものように、パフォーマンスのためのマイクロ最適化は、そうしないと許容できないコストやパフォーマンスにつながる場合にのみ重要です。それ以外の場合、これら 2 つの問題 (UUID のストレージ スペースと、DB でそれらを維持およびクエリするのにかかる時間) は、ストレージの安価なコストと DB インデックスの能力を考えると、それほど重要ではありません。はるかに簡単です。:)

于 2009-12-15T16:52:22.263 に答える
7
  1. char(36)の代わりにお勧めしvarchar(36)ます。hsqldb についてはわかりませんが、多くの DBMS では char の方が少し高速です。

  2. 検索の場合、DBMS がスマートであれば、整数値を使用して UUID に「近づける」ことができます。

たとえば、int 列と char(36) をテーブルに追加します。テーブルに挿入するときは、uuid.hashCode() を int 列に挿入します。次に、検索は次のようになります

WHERE intCol = ? and uuid = ?

前述したように、hsqldb が mysql や sql サーバーのようにスマートな場合、intCol で検索を絞り込み、uuid で比較するのは多くても数個の値のみです。このトリックを使用して、100 万以上のレコード テーブルを文字列で検索します。基本的に、整数ルックアップと同じくらい高速です。

于 2009-12-15T16:51:12.547 に答える
2

BINARY(16) を使用することも可能です。キャラクタータイプより収納スペースが少ない。上記のように CREATE TYPE UUID .. または CREATE DOMAIN UUID .. を使用します。

于 2010-01-17T03:42:55.047 に答える
0

最も簡単な方法は、独自のドメインを作成して、独自の UUID「タイプ」(実際にはタイプではありませんが、ほとんど) を作成することだと思います。

この質問への回答も検討する必要があります (特に、「通常の」主キーの代わりに使用する予定がある場合)。

HSQLDB の INT、BIGINT、または UUID/GUID? (コミュニティによって削除されました ...)

HSQLDB: ドメインの作成と操作

于 2009-12-15T16:43:49.877 に答える