DWH из нескольких схем

У меня есть проект в postgresql для создания DWH из нескольких схем. Схемы имеют одинаковую структуру (таблицы, ограничения). Я застрял в этой проблеме: у меня есть таблица "сотрудники" во всех схемах, которые я буду использовать в DWH. Первая запись в сотрудниках таблицы schema1 - 1 John Dow, первая запись в сотрудниках таблицы schema2 - 1 Mary Jane (столбец id - автоинкремент). Есть ли способ создать DWH с этой структурой? Есть ли способ разбить данные схемы? Спасибо.

2 ответа

Решение

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

  1. Убедитесь, что все таблицы в вашей базе данных, которые имеют последовательные целочисленные первичные ключи или внешние ключи, ссылающиеся на них, используют один и тот же тип данных. Этот тип данных должен быть достаточно большим, чтобы в нем можно было хранить значения для всех строк в любой таблице, не касаясь самых значимых 8 битов. Так INTEGER (32-битные) ключи оставляли бы 24 бита, оставляя до 16777215 вставок, и BIGINT (64-битные) ключи оставят 56-битные оставшиеся, что позволяет до 72057594037927935 вставок. (Осторожно, что ALTER TABLE ... ALTER COLUMN SET DATA TYPE требует полной перезаписи таблиц и может быть очень медленным для таблиц большого объема.)
  2. Присвойте каждой БД уникальный 7-битный идентификатор базы данных, который будет занимать самые значимые 8 бит каждого ключа. Вы получаете только 7 битов, а не 8, потому что верхний бит - это бит подписи, и вы не можете его коснуться.
  3. Для каждого целочисленного первичного ключа и внешнего ключа, ссылающихся на него в базе данных, обновите его, добавив DB_ID << 24 (для 32-битных ключей) или DB_ID << 56 (для 64-битных ключей) к нему. Например, для БД с ID 13 и 32-битными ключами вы должны добавить 218103808 к каждому значению ключа.
  4. При желании добавить CHECK CONSTRAINTs к каждой таблице, убедившись, что их ключ находится в диапазоне [(DB_ID << 24) + 1, ((DB_ID+1) << 24) - 1],
  5. Перезапустите последовательность 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.

Таким образом, вы можете легко перевести все числа без столкновений.

Другие вопросы по тегам