2009-12-15 5 views
6

Я хочу сохранить UUID, созданные с помощью java.util.UUID в базе данных HSQLDB.Хранение UUID в базе данных HSQLDB

Очевидным вариантом является просто хранить их как строки (в коде они, вероятно, просто будут рассматриваться как таковые), то есть varchar (36).

Какие другие варианты я должен рассмотреть для этого, принимая во внимание такие вопросы, как размер базы данных и скорости запроса (ни один из которых являются огромное беспокойство из-за объема данных, связанных, но я хотел бы рассмотреть их, по крайней мере)

ответ

6

У вас есть несколько вариантов:

  • сохранить как VARCHAR (36), как вы уже предложили. Это займет 36 байт (288 бит) памяти на UUID, не считая накладных расходов.
  • Храните каждый UUID в двух столбцах BIGINT, один для наименее значимых бит и один для наиболее значимых бит; используйте UUID#getLeastSignificantBits() и UUID#getMostSignificantBits(), чтобы захватить каждую часть и сохранить ее соответствующим образом. Это займет 128 бит хранилища на UUID, не считая накладных расходов.
  • Храните каждый UUID в качестве ОБЪЕКТА; это сохраняет его как двоичную сериализованную версию класса UUID. Я понятия не имею, сколько места это занимает; Мне нужно запустить тест, чтобы узнать, что такое стандартная сериализованная форма Java UUID.

В расквитаться и минусы каждого подхода основывается на том, как вы передаете в UUID, вокруг вашего приложения - если вы передаете их вокруг, как их строковые эквиваленты, то оборотную сторону требует двойной емкости для подхода VARCHAR (36), вероятно, перевешивается тем, что не нужно преобразовывать их каждый раз, когда вы выполняете запрос или обновление БД. Если вы передаете их в качестве родных UUID, то метод BIGINT, вероятно, будет довольно низким.

О, и это приятно, что вы хотите рассмотреть вопросы о скорости и пространстве для хранения, но, как многие из них, как я сказал, хорошо, что вы признаете, что это может быть критически важно, учитывая объем данных, приложение будет хранить и поддерживать. Как всегда, микро-оптимизация ради производительности важна только в том случае, если это не приводит к недопустимой стоимости или производительности. В противном случае эти две проблемы - пространство памяти UUID и время, необходимое для их обслуживания и запроса в БД, - имеют достаточно низкую важность, учитывая дешевую стоимость хранения и способность индексов БД сделать вашу жизнь намного легче. :)

+0

Умм ... в чем вселенная делает 36 * 8 = 256? 36 * 8 = 288 в этом: P – MetroidFan2002

+1

Увы, я, по-видимому, живу в своей собственной вселенной. :/Я отредактирую его. – delfuego

0

Я думаю, что проще всего было бы создать свой собственный домен, создав, таким образом, свой собственный «тип» UUID (не совсем тип, но почти).

Вы должны также рассмотреть ответ на этот вопрос (особенно, если вы планируете использовать его вместо «нормального» первичного ключа)

INT, BIGINT or UUID/GUID in HSQLDB?

HSQLDB: Domain Creation and Manipulation

7
  1. Я бы рекомендовал char(36) вместо varchar(36). Не уверен в hsqldb, но во многих СУБД char немного быстрее.

  2. Для поиска, если СУБД умна, тогда вы можете использовать целочисленное значение, чтобы «приблизиться» к вашему UUID.

Например, добавьте столбец int к вашей таблице, а также символ (36). Когда вы вставляете в таблицу, вставьте uuid.hashCode() в столбец int. Тогда ваши поиски могут быть, как это

WHERE intCol = ? and uuid = ?

Как я уже сказал, если HSQLDB умен, как MySQL или SQL Server, он будет сужать поиск по intCol, а затем сравнивать только в большинстве нескольких значений по UUID , Мы используем этот трюк для поиска по миллионам таблиц записей по строкам, и это по существу так же быстро, как поиск по целому числу.

+0

Мне нравится эта идея. Не думайте, что нам это понадобится здесь из-за большого количества записей, но я обязательно запомню это на будущее! Благодарю. – William

+0

Не добавил ли индекс в столбец uuid, по существу, такой же, как это решение? – Sasi

2

Использование BINARY (16) - еще одна возможность. Меньше дискового пространства, чем типы символов. Используйте CREATE TYPE UUID .. или CREATE DOMAIN UUID .. как было предложено выше.

Смежные вопросы