Синхронизация 2 баз данных с разными схемами

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

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

Привет, Мош


person Mosh    schedule 13.07.2010    source источник
comment
Это должен быть процесс извлечения-преобразования-загрузки в реальном времени или в течение ночи?   -  person Paolo    schedule 13.07.2010
comment
symricds.org - это открытый исходный код, и я считаю, что должен сделать это   -  person kervin    schedule 06.10.2016


Ответы (1)


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

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

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

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

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

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

person Panagiotis Kanavos    schedule 13.07.2010
comment
Большое спасибо за развернутый ответ. Несколько мыслей: я подумал о создании собственных хранимых процедур для обновления целевой базы данных. Однако это блокирует первоначальный запрос (который был для изменения данных). Другими словами, пользователь должен дождаться обновления данных в двух местах. Я читал кое-что о nServiceBus и подумал, что, возможно, смогу реализовать отдельный денормализатор, который я могу вызывать асинхронно. Таким образом, пользователь быстро получает ответ, не дожидаясь обновления баз данных чтения. Что ты думаешь по этому поводу? - person Mosh; 15.07.2010
comment
Кроме того, что касается SSIS, вы упомянули, что он работает по расписанию. Разве в данном случае это не было бы проблемой для меня? Представьте, что пользователь вставляет новый продукт, но SSIS может работать через 2 часа. Предполагая, что все запросы на чтение данных обрабатываются базой данных Read, пользователь может вставить новый Продукт и не увидеть его через 2 часа! - person Mosh; 15.07.2010