Проблема при сливании данных из разных источников. Какой из атрибутов сделать ключевым в БД?
Добрый день!
Описание проблемы:
Система для крупных фирм занимающихся маркетингом и анализом данных о конкурентах
Одна из функций учет данных о фирмах и их структуре (дочьки, филиалы и т.д.) и передача данных в Центральный офис
Т.е. клиентские машины с сервером установлены в разных городах (представительствах).
Атрибуты. Например:
Короткое наименование: Рул
Полное наименование: ООО "НК Рул"
ИНН: 546456456
Организаонная форма: Общество с ограниченной ответственностью
Страна: Россия
Адрес: Сыктывкар, ул. Марка, 7
Деятельность: Продажа и добыча драг металлов
Вышестоящая фирма: ОАО "Рарус"
Нижестоящие фирмы: ООО "КХТ", ООО "БРАК"
Владелец: Сидоров ИП
Аналитик каждые сутки передает информацию о в Центральный офис аналитиков.
Система многосерверная. Т.е. БД данных не централизованная. Для того чтобы информация об объетах и их структуре была идентична информация о структуре передается в центральный офис. Скажем так, для выравнивания структуры.
Логичнее предположить что ключевой атрибут это "полное наименование" или ИНН. Но есть одно но,
в процессе анализа выявляются фирмы (дочьки) данные о которых не полные. Например:
"Появилась информация о некой фирмы зарегистрированную в г. Башма, владелец Майкол. Имеется информация о том что эта фирма связана с ОАО "Рузатана". Прошу учесть и проверить"
Т.е. на одном из клиентских машин будет зафиксирована инфа об объете без его наименование. И нужно будет эту инфу отправить.
Подскажите пожалуйста, какой атрибут (или чтото "другое") сделать ключевым и почему?
Спасибо за ответ. У меня остался вопрос. Пример привожу:
Условие: есть 2 сервера с системой и с разными БД.
На сервере №1 Пользователь №1 завел компанию ОАО "ЮКОС" с филиалами ООО "Дочька Юкоса".
На серваке №2 центрального офиса пользователь №3 завел компанию ОАО "ЮКос" но о наличии филиалов он не знает. На серваке №2 заведено помимо этой компании, другие компании. Пользователь №1 передает данные о ОАО Юкосе и филиалах на сервак №2. ВОПРОС: Как система (сервер №2) узнает что пришли данные о ОАО "Юкос" и его дочьках и соответствующе обновит данные? (синхронизирует, "уравняет" структуру)
У одинаковых по наименованию объектов на разных серваках, будут разные генерируемые АЙДИ. Тогда как системы находящиеся на разных серваках, синхронизируют данные между собой?
Ребята правильно пишут про айдишник. Раз у тебя полнота данных не определена, то единственным постоянно присутствующим элементом записи будет дополнительное поле айдишника.
Михаил спасибо за коммент. У меня остался вопрос который адресую всем наверное. Пример привожу:
Условие: есть 2 сервера с системой и с разными БД.
На сервере №1 Пользователь №1 завел компанию ОАО "ЮКОС" с филиалами ООО "Дочька Юкоса".
На серваке №2 центрального офиса пользователь №3 завел компанию ОАО "ЮКос" но о наличии филиалов он не знает. На серваке №2 заведено помимо этой компании, другие компании. Пользователь №1 передает данные о ОАО Юкосе и филиалах на сервак №2. ВОПРОС: Как система (сервер №2) узнает что пришли данные о ОАО "Юкос" и его дочьках и соответствующе обновит данные? (синхронизирует, "уравняет" структуру). Как я понимаю генерируемый ID одинаковых объектов на разных серваках будет разный?
kiru: честно говоря я знаю этот вопрос не очень то.
Репликация если и подойдёт то только синхронная.
А так получается, что нужно разделение на базы мастер и рабочие. И тогда расхождения сперва аккумулируются в мастер базе, а потом уже... При чём в логике импорта в мастер базу ты и можешь контролировать дубликаты.
Это уже отдельная даже не песня, а целый мюзикл.
Генерируемый ID в данном случае будет единственным правильным решением, int/long или UUID - в зависимости от взглядов/пожеланий. В своё время пробовал различные идентификаторы вроде ИНН, КПП и т.д. делать ключами, но ничего хорошего не вышло из этого - полноценность вводимых данных конечным пользователем, как правило, не гарантирована, ровно как и их достоверность.
Спасибо большое Александр за подробный ответ. да так и есть. полнота вводимых данных не гарантирована как и достоверность. Правильно я понял, что на каждый объект "компания"необходимо сгенерировать уникальный id? А если так, то как тогда другой сервер узнает этот объект и соответствующе "разместит" в структуре подчинений? Например: На сервере №1 Пользователь №1 завел компанию ОАО "ЮКОС" с филиалами ООО "Дочька Юкоса". На серваке №2 центрального офиса пользователь №3 завел компанию ОАО "ЮКос" но о наличии филиалов он не знает. На серваке №2 заведено помимо этой компании, другие компании. Пользователь №1 передает данные о ОАО Юкосе и филиалах на сервак №2. ВОПРОС: Как система (сервер №2) узнает что пришли данные о ОАО "Юкос" и соответствующе обновит данные? (синхронизирует, "уравняет" структуру)
Александр Косарев Александр Косарев Как я понимаю генерируемый ID одинаковых объектов на разных серваках будет разный? А если так? то как системы синхронизируют данные?
kiru: вариантов синхронизации много, но пару предложу%
Вариант 1. Потребуется сервер очередей сообщений (ActiveMQ, RabbitMQ и т.д.). При заведении новой компании сервер кидает в какой-то топик сообщение с параметрами созданной компании (никто не мешает и полностью объект отправить в ObjectMessage). Остальные серверы, подписанные на этот топик, получают сообщение и заводят/актуализируют компанию у себя.
Вариант 2. У всех серверов реализовать веб-сервис с методом сохранения компании. Тогда сервер, на котором завели компанию, должен будет дёрнуть этот метод веб-сервисов других серверов и передать информацию о компании. Но тут нужно будет соображать какое-нибудь Service Discovery.
А вообще, ИМХО, отсутствие централизованности системы в данном случае просится в минус. Централизованность помогла бы решить проблему без архитектурных костылей.
есть еще одно ограничение:
-автоматическая синхронизация невозможна
-пользователь отправляет данные вручную
Это связано с принципом, данные доводяться в объеме в части касающейся.
Вопрос, все таки непонятно, как другой сервер будет понимать, что пришла информация именно об указанной компании? Ведь id будет разный?
Сервер№1:
ОАО Юкос (с дочьками ООО "Хлеб")
-ID: 0005
Сервер №2 (пользователь также создал запись о компании которую сам нашел):
ОАО Юкос
--ID: 0354
При отправки данных с сервера №1 на сервер№2, как система поймет объект ОАО Юкос с iD 0005, это тоже самое что и объект ОАО Юкос с iD 0354?