У меня есть таблица, содержащая ряд уникальных строк, которые мне нужны для быстрого поиска (кроме кэширования памяти).
@Entity
public class UniqueString {
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private Long id;
@Basic
@NaturalId
private String stringId;
}
Изначально у меня была переменная stringId
как @Id
, однако оказалось, что некоторые базы данных (например, oracle) перешли в full table scan
при получении объекта по строковому идентификатору;следовательно я переключился на длинный вместо.
Как быстро получить доступ к объекту UniqueString
из строки stringId
.Пока я вижу два решения:
- Опять аннотируем
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'