DWH из нескольких схем
У меня есть проект в postgresql для создания DWH из нескольких схем. Схемы имеют одинаковую структуру (таблицы, ограничения). Я застрял в этой проблеме: у меня есть таблица "сотрудники" во всех схемах, которые я буду использовать в DWH. Первая запись в сотрудниках таблицы schema1 - 1 John Dow, первая запись в сотрудниках таблицы schema2 - 1 Mary Jane (столбец id - автоинкремент). Есть ли способ создать DWH с этой структурой? Есть ли способ разбить данные схемы? Спасибо.
2 ответа
Вероятно, самым простым способом будет присвоение некоторому числу старших битов ключа идентификатора источника, что сделает ваши ключи уникальными во всех ваших исходных базах данных. Например, давайте предположим, что у вас никогда не будет более 100 баз данных, которые вы храните, поэтому 7-битного идентификатора базы данных будет достаточно.
- Убедитесь, что все таблицы в вашей базе данных, которые имеют последовательные целочисленные первичные ключи или внешние ключи, ссылающиеся на них, используют один и тот же тип данных. Этот тип данных должен быть достаточно большим, чтобы в нем можно было хранить значения для всех строк в любой таблице, не касаясь самых значимых 8 битов. Так
INTEGER
(32-битные) ключи оставляли бы 24 бита, оставляя до 16777215 вставок, иBIGINT
(64-битные) ключи оставят 56-битные оставшиеся, что позволяет до 72057594037927935 вставок. (Осторожно, чтоALTER TABLE ... ALTER COLUMN SET DATA TYPE
требует полной перезаписи таблиц и может быть очень медленным для таблиц большого объема.) - Присвойте каждой БД уникальный 7-битный идентификатор базы данных, который будет занимать самые значимые 8 бит каждого ключа. Вы получаете только 7 битов, а не 8, потому что верхний бит - это бит подписи, и вы не можете его коснуться.
- Для каждого целочисленного первичного ключа и внешнего ключа, ссылающихся на него в базе данных, обновите его, добавив
DB_ID << 24
(для 32-битных ключей) илиDB_ID << 56
(для 64-битных ключей) к нему. Например, для БД с ID 13 и 32-битными ключами вы должны добавить 218103808 к каждому значению ключа. - При желании добавить
CHECK CONSTRAINT
s к каждой таблице, убедившись, что их ключ находится в диапазоне[(DB_ID << 24) + 1, ((DB_ID+1) << 24) - 1]
, - Перезапустите последовательность PK каждой таблицы, используя:
ALTER SEQUENCE :seq_name MINVALUE :min_val MAXVALUE :max_val START WITH :start_val RESTART WITH :start_val
, гдеmin_val = (DB_ID << 24) + 1
,max_val = ((DB_ID+1) << 24) - 1
, а такжеstart_val = currval(SEQUENCE_NAME)
,
Пересчитать первичный ключ как
<id> * <# of schemas> + <schema number>
Например, если у вас есть три схемы, число 7 из первой схемы станет 7 * 3 + 1 = 22, а число 5 из третьей схемы станет 5 * 3 + 3 = 18.
Таким образом, вы можете легко перевести все числа без столкновений.