我有一个包含一系列唯一字符串的表,我需要提供快速查找(除了内存缓存)。
@Entity
public class UniqueString {
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private Long id;
@Basic
@NaturalId
private String stringId;
}
最初我有stringId
变量 as ,但事实证明,在通过字符串 id 检索对象时@Id
,某些数据库(例如,oracle)进入了;full table scan
因此我改用 long 。
如何UniqueString
从字符串中快速访问对象stringId
。到目前为止,我看到了两种解决方案:
- 再次,注释
stringId
并@id
尝试找到解决full table scans
某些数据库中出现的原因 - 将字符串散列成 a
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'