0

一連の一意の文字列を含むテーブルがあり、(メモリ キャッシュのほかに) クイック ルックアップを提供する必要があります。

@Entity
public class UniqueString {
    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    private Long id;

    @Basic
    @NaturalId
    private String stringId;
}

最初はstringId変数を として持っていましたが、文字列 ID でオブジェクトを取得するときに@Id一部のデータベース (oracle など) が入ったことが判明しました。full table scanしたがって、代わりにロングに切り替えました。

UniqueStringstring からオブジェクトにすばやくアクセスするにはどうすればよいですかstringId。これまでのところ、2 つの解決策があります。

  • 繰り返しますが、注釈stringIdを付けて、一部のデータベースで発生@idする理由の修正を見つけてくださいfull table scans
  • 文字列をlong(精度を落としながら) にハッシュし、ルックアップ テーブルを使用してハッシュに一致するすべてのオブジェクトを返し、それらのstringIdプロパティを比較して等しいかどうかを調べ、探している一致を見つけます。

.

LookupTable                    UniqueString
+----+------+                +----+----+----------+
|hid | hash |                | id |hid | stringId |
+----+------+                +----+----+----------+
| 1  |  123 | -------------> | .. | 1  |  ....    |
| 2  |  321 |        `-----> | .. | 1  |  ....    |
+----+------+                +----+----+----------+

ご意見、ご提案は?

[編集]わかりました、上の表の図は単純に正規化できることに気付きました

UniqueString
+----+-----+----------+
| id |hash | stringId |
+----+-----+----------+
| .. | 123 |  ....    |
| .. | 123 |  ....    |
| .. | 321 |  ....    |
+----+-----+----------+

次のクエリの両方がほぼ同じように実行されると思われるため、これによりすべての違いが生じます。

  • from UniqueString where hash='123'
  • from UniqueString where stringId='abc'
4

2 に答える 2

4
  1. データベースのstringId列にインデックスがあることを確認してください

  2. hqlまたは基準APIを使用してデータベースにクエリを実行するだけです

  3. この種のクエリをキャッシュするようにクエリ キャッシュを構成します。

于 2011-02-25T17:28:53.170 に答える
1

これは、前述の列をデータベースに保持する方法に関するものです。正しい方法は、列にハッシュ インデックスを定義し、エンティティ内のフィールドをインデックスとしてマークすることだと思います。

于 2011-02-25T18:53:27.810 に答える