В некоторых ситуациях Ваш бизнес требует создания новых объектов, но в то же время бизнес-логики на основе некоторых фиксированных объектов. Для фиксированных Вы хотите перечисление, новые, очевидно, требуют некоторого набора/дб.
я видел проекты использовать набор для этого вида объектов, приводя к бизнес-логике в зависимости от данных, которые могут быть удалены пользователем. Никогда не делайте это, но действительно создайте отдельное перечисление для фиксированных и набор для других, столь же требуемых.
другое решение состоит в том, чтобы использовать набор с неизменными объектами для фиксированных значений. Эти объекты могли также находиться в дб, но иметь дополнительный флаг, таким образом, пользователи не могут обновить / удаляют его.
Если ваши данные уникальны, вы должны создать для них индекс UNIQUE
.
Это не подразумевает дополнительных накладных расходов и в некоторых случаях влияет на решения оптимизатора, чтобы он мог выберите лучший алгоритм.
В SQL Server
и в PostgreSQL
, например, при сортировке по ключу UNIQUE
оптимизатор игнорирует ] ORDER BY
после этого используются предложения (поскольку они не имеют отношения к делу), то есть этот запрос:
SELECT *
FROM mytable
ORDER BY
col_unique, other_col
LIMIT 10
будет использовать индекс для col_unique
и не будет выполнять сортировку по other_col
, потому что это бесполезно.
Этот запрос:
SELECT *
FROM mytable
WHERE mycol IN
(
SELECT othercol
FROM othertable
)
также будет преобразован во INNER JOIN
(в отличие от SEMI JOIN
), если есть UNIQUE
указатель на othertable.othercol
.
Индекс всегда содержит какой-то указатель на строку ( ctid
в PostgreSQL
, указатель на строку в MyISAM
, первичный ключ / уникальный указатель в ] InnoDB
), и листья упорядочены по этим указателям, поэтому на самом деле каждый лист индекса уникален в некотором роде (хотя это может быть неочевидно).
См. Эту статью в моем блоге для получения подробной информации о производительности:
Ну, обычно индексы - это B-деревья, а не хеши (есть индексы на основе хешей, но самый распространенный индекс (по крайней мере, в PostgreSQL) основан на B Tree).
Что касается скорости - уникально должно быть быстрее - когда сканирование индекса находит строку с заданным значением, ему не нужно искать, есть ли другие строки с этим значением, и можно немедленно завершить сканирование.
но наиболее распространенный индекс (по крайней мере, в PostgreSQL) основан на дереве B).Что касается скорости - уникальный должен быть быстрее - когда сканирование индекса находит строку с заданным значением, ему не нужно искать, есть ли какие-либо другие строки с этим значением, и сканирование можно завершить немедленно.
но наиболее распространенный индекс (по крайней мере, в PostgreSQL) основан на дереве B).Что касается скорости - уникальный должен быть быстрее - когда сканирование индекса находит строку с заданным значением, ему не нужно искать, есть ли какие-либо другие строки с этим значением, и сканирование можно завершить немедленно.