Объединение идентификаторов с расширением для хранения нескольких строк, связанных с сущностью, в одном семействе столбцов - PullRequest
1 голос
/ 04 ноября 2011

Я объединяю два целочисленных идентификатора с помощью побитовых операций (как описано ниже), чтобы создать один первичный ключ типа long. Я хотел знать, если это хорошая практика. Это помогло бы мне сохранить несколько строк сущности в одном семействе столбцов, добавив различные расширения к entityId. Есть ли лучшие способы? Мои идентификаторы имеют тип Integer (4 байта).

public static final long makeCompositeKey(int entityId, int extension){
    return (long)entityId << 32 | extension;
}

Ответы [ 2 ]

1 голос
/ 04 ноября 2011

Большинство баз данных имеют встроенный способ автоматического создания идентификаторов, и ваше приложение не должно заботиться об этом. Я наиболее знаком с Postgres, где я создаю последовательность для каждой таблицы и использую ее для столбца @Id, но я знаю, что у Oracle и MSSQL есть свой собственный способ выполнить то же самое.

В целом, однако, каждый столбец в вашей базе данных должен хранить один фрагмент информации. Взятие двух частей информации и объединение их вместе, как вы предлагаете, противоречит «правильному» дизайну базы данных в соответствии с «изучением книг». Под этим я подразумеваю: вы должны делать это только в том случае, если у вас есть очень, очень веская причина для этого (и даже тогда вы должны подумать об этом два или три раза, прежде чем делать это на самом деле). Если у вас нет хорошего причина для этого, тогда не делайте этого.

0 голосов
/ 04 ноября 2011

Это не хороший дизайн. Это должны быть два разных столбца с составным ограничением. Вы можете иметь другой сгенерированный уникальный идентификатор для первичного ключа.

Помимо первичного ключа, вы также можете создать составной индекс по двум столбцам для ускорения запросов, если большинство запросов будут фильтроваться на основе этих двух значений.

...