Перед нами стоит задача интегрирования нескольких баз данных, различных видов (Oracle, SQL Server) и имеющих различную структуру.
Ранее на форуме я задавал вопрос о том, имеются ли стандартные способы решения задачи такого рода, на что не получил достаточного количества ответов и отзывов. Один из ответивших сказал, что лучше реализовывать такой механизм вручную.
Я опишу упрощенный теоретический кейс (чтобы не вдаваться в излишние детали конкретно нашей ситуации) и изложу механизм интеграции, который у меня возник в голове.
Преположим, что у нас есть 2 базы данных (Oracle, SQL Server 2000), в каждой из которых имеется таблица клиентов. Это разные таблицы, имеющие разную структуру данных, и сами данные (клиенты) в этих таблицах разные. Для наглядности можем считать, что в Oracle содержатся клиенты-юрлица (ClientsCompanies), а в SQL Server 2000 — клиенты-физлица (ClientsPeople).
Перед нами стоит задача разработка еще одной базы данных (на этот раз SQL Server 2005), в которой была бы таблица AllClients, в которой содержались бы данные из двух перечисленных выше таблиц.
Задача состоит в том, чтобы в таблице AllClients всегда находились актуальные данные из двух других таблиц — то есть данные должны быть синхронизированы в режиме real-time (или с совсем небольшой задержкой).
Вот такая задача. Как ее реализовать?
Я приведу решение, к которому я пришел — но т. к. я не специализируюсь на БД и на SQL, мое решение может оказаться не самым лучшим.
1) В БД SQL Server 2005 (главной БД, в которой таблица AllClients) создаются таблицы ClientsCompanies и ClientsPeople, имеющие в точности такие же структуры, как и соответствующие таблицы в двух исходных БД.
2) С помощью некоторого механизма (простого копирования, репликации и др.) данные из исходных таблиц переносятся в таблицы в SQL Server 2005.
3) В SQL Server 2005 я создаю дополнительную таблицу соответствий идентификаторов, имеющую следующую структуру.
а) SourceTable = "ClientsCompanies" | "ClientsPeople".
б) ExternalClientId — идентификатор клиента в таблице внешней БД (т. е. идентификатор клиента в таблице ClientsCompanies или ClientsPeople).
в) ClientId — идентификатор клиента в таблице "AllClients".
4) Делаю View, которое возвращает клиентов из таблиц ClientsCompanies и ClientsPeople, а идентификаторы берет из таблицы соответствий.
То есть в реальности таблицы AllClients не будет — будет виртуальная таблица / представление, которое будет содержать клиентов из двух внешних таблиц, при этом клиенты в таблице AllClients будут иметь уникальные идентификаторы.
5) При добавлении или удалении клиентов из таблиц ClientsCompanies и ClientsPeople обновляем таблицу соответствий идентификаторов.
Вот это хитрая часть — как раз хотел спросить, как лучше реализовать такое авообновление таблицы соответствий идентификаторов — напишу вопрос в виде отдельной темы.
Хмм... Понятно ли то, что я написал? Мне кажется, что не очень — хотя старался написать понятно )
В любом случае — кто может какие дать советы по решению данной задачи? Спасибо!