一連の一意の文字列を含むテーブルがあり、(メモリ キャッシュのほかに) クイック ルックアップを提供する必要があります。
@Entity
public class UniqueString {
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private Long id;
@Basic
@NaturalId
private String stringId;
}
最初はstringId
変数を として持っていましたが、文字列 ID でオブジェクトを取得するときに@Id
一部のデータベース (oracle など) が入ったことが判明しました。full table scan
したがって、代わりにロングに切り替えました。
UniqueString
string からオブジェクトにすばやくアクセスするにはどうすればよいですか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'