3

У нас есть нормализованная база данных SQL Server 2008, разработанная с использованием общих таблиц. Таким образом, вместо отдельной таблицы для каждого объекта (например, Products, Orders, OrderItems и т. Д.), Мы имеем общие таблицы (Entities, Instances, Relationships, Attributes и т. Д.).База данных Syncrhonizing 2 с различными схемами

Мы решили создать отдельную денормализованную базу данных для быстрого извлечения данных. Не могли бы вы посоветовать мне различные технологии для синхронизации этих двух баз данных, предполагая, что у них разные схемы?

Cheers, Мош

+0

Должно ли это быть в режиме реального времени или в течение ночи? Процесс извлечения-преобразования-нагрузки? – Paolo

+0

https://www.symmetricds.org/ является открытым исходным кодом, и я считаю, что должен это сделать – kervin

ответ

3

Когда две базы данных имеют столь радикально разные схемы вы должны смотреть на методы для миграции данных или репликации, а не синхронизации. SQL Server предоставляет две технологии для этого: SSIS и Replication, или вы можете написать свой собственный скрипт для этого.

Репликация принимает новые или измененные данные из исходной базы данных и копирует их в целевую базу данных. Он предоставляет механизмы для планирования, упаковки и распространения изменений и может обрабатывать как обновления в режиме реального времени, так и пакетного обновления. Для работы необходимо добавить достаточную информацию в обеих базах данных для отслеживания изменений и сопоставления строк. В вашем случае было бы трудно определить, какие «Продукты» были изменены, поскольку вам нужно было бы идентифицировать все соответствующие измененные строки в 4 или более разных таблицах. Это можно сделать, но это потребует определенных усилий. В любом случае вам придется создавать представления, соответствующие целевой схеме, поскольку репликация не позволяет преобразовывать исходные данные.

SSIS доставит данные из одного источника, преобразует их и нажимает на цель. Он не имеет встроенных механизмов отслеживания изменений, поэтому вам нужно будет добавлять поля в свои таблицы для отслеживания изменений. Это строго пакетный процесс, который может выполняться в соответствии с расписанием. Основное преимущество заключается в том, что вы можете выполнять самые разнообразные преобразования, в то время как репликация практически не имеет значения (кроме рисования данных из представления). Вы можете создавать потоки данных, которые изменяют только соответствующее поле Product, когда изменяется запись атрибута Product related Attribute, или просто воссоздают всю запись продукта и перезаписывают целевую запись.

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

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

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

+0

Большое спасибо за ваш длинный подробный ответ. Всего несколько мыслей: я думал о создании собственных хранимых процедур для обновления целевой базы данных. Однако это блокирует первоначальный запрос (который предназначен для изменения данных). Таким образом, другими словами, пользователю приходится ждать, пока данные будут обновлены в 2 местах. Я читал некоторые о nServiceBus и думал, что могу реализовать отдельный денормализатор, который я могу назвать асинхронным. Таким образом, пользователь быстро получает ответ, не дожидаясь обновления базы данных Reads. Что вы думаете об этом? – Mosh

+0

Кроме того, что касается SSIS, вы упомянули, что он работает в соответствии с графиком. Разве это не было бы проблемой для меня в этом случае? Представьте, что пользователь вставляет новый продукт, но SSIS может работать через 2 часа.Предполагая, что все запросы на чтение данных обрабатываются базой данных Read, пользователь может вставить новый продукт и не видеть его через 2 часа! – Mosh

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