У вас есть несколько вариантов:
- сохранить как VARCHAR (36), как вы уже предложили. Это займет 36 байт (288 бит) памяти на UUID, не считая накладных расходов.
- Храните каждый UUID в двух столбцах BIGINT, один для наименее значимых бит и один для наиболее значимых бит; используйте UUID#getLeastSignificantBits() и UUID#getMostSignificantBits(), чтобы захватить каждую часть и сохранить ее соответствующим образом. Это займет 128 бит хранилища на UUID, не считая накладных расходов.
- Храните каждый UUID в качестве ОБЪЕКТА; это сохраняет его как двоичную сериализованную версию класса UUID. Я понятия не имею, сколько места это занимает; Мне нужно запустить тест, чтобы узнать, что такое стандартная сериализованная форма Java UUID.
В расквитаться и минусы каждого подхода основывается на том, как вы передаете в UUID, вокруг вашего приложения - если вы передаете их вокруг, как их строковые эквиваленты, то оборотную сторону требует двойной емкости для подхода VARCHAR (36), вероятно, перевешивается тем, что не нужно преобразовывать их каждый раз, когда вы выполняете запрос или обновление БД. Если вы передаете их в качестве родных UUID, то метод BIGINT, вероятно, будет довольно низким.
О, и это приятно, что вы хотите рассмотреть вопросы о скорости и пространстве для хранения, но, как многие из них, как я сказал, хорошо, что вы признаете, что это может быть критически важно, учитывая объем данных, приложение будет хранить и поддерживать. Как всегда, микро-оптимизация ради производительности важна только в том случае, если это не приводит к недопустимой стоимости или производительности. В противном случае эти две проблемы - пространство памяти UUID и время, необходимое для их обслуживания и запроса в БД, - имеют достаточно низкую важность, учитывая дешевую стоимость хранения и способность индексов БД сделать вашу жизнь намного легче. :)
Умм ... в чем вселенная делает 36 * 8 = 256? 36 * 8 = 288 в этом: P – MetroidFan2002
Увы, я, по-видимому, живу в своей собственной вселенной. :/Я отредактирую его. – delfuego