powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / MySQL [игнор отключен] [закрыт для гостей] / Как организовать связь между звездой: Центральная база - Много второстепенных баз
25 сообщений из 36, страница 1 из 2
Как организовать связь между звездой: Центральная база - Много второстепенных баз
    #38676457
m1andry
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Можно было бы пойти по простому пути и сделать репликацию, но задача несколько иная.

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

К примеру, во второстепенной базе №1 и №2 были добавлены свои клиенты, по ним созданы заказы и т.д.
В 00:00 происходит отправка в центральную базу (думаю сделать скрипт синхронизации PHP и повесить на крон) со второстепенных баз всех изменений за день.
Затем в 01:00 со всех второстепенных баз делается запрос в центральную на обновление таблицы клиентов, и они получают в ответ все изменения (добавления/редактирования/удаления).

Но тут у меня возникает вопрос, как быть с primary key, что бы избежать дублей при получении данных со второстепенных баз?
Сделать составной primary из BaseID (код второстепенной базы) + TableID (обычный AI key)?
...
Рейтинг: 0 / 0
Как организовать связь между звездой: Центральная база - Много второстепенных баз
    #38676460
m1andry
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
UPD.
Отдельная проблема возникает с пониманием синхронизации со второстепенной базы таблиц пересечений (т.е. где хранятся связи таблиц, к примеру структура таблицы Order: ClientID, ProductID), как быть с ней? Вешать OrderID + BaseID на такую таблицу, которые до этого по сути вообще были не нужны?
...
Рейтинг: 0 / 0
Как организовать связь между звездой: Центральная база - Много второстепенных баз
    #38676463
m1andry
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
UPD.
Синхронизацию думал делать "INSERT ... ON DUBLICATE UPDATE" по запросу "SELECT * WHERE ChangeStamp > ДатаПоследнейСинхронизации", поле ChangeStamp во всех таблицах timestamp update on change
...
Рейтинг: 0 / 0
Как организовать связь между звездой: Центральная база - Много второстепенных баз
    #38676474
Arm79
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Primary key - GUID
...
Рейтинг: 0 / 0
Как организовать связь между звездой: Центральная база - Много второстепенных баз
    #38676620
biwed.ru
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
m1andry,
Добрый день.
Можно посоветовать вам начать изучать Business Intelligence и особенно прочитать про проектирование DWH.
m1andryВ 00:00 происходит отправка в центральную базу (думаю сделать скрипт синхронизации PHP и повесить на крон) со второстепенных баз всех изменений за день.

Для таких случаев гораздо эффективнее использовать ETL сервера. В частности запуск PDI (Pentaho Data Integration) можно также переложить на крон.
m1andryНо тут у меня возникает вопрос, как быть с primary key, что бы избежать дублей при получении данных со второстепенных баз?
Для primary использовать суррогатный ключ. а BaseID (код второстепенной базы) + TableID (обычный AI key) Альтернативный.

m1andryСинхронизацию думал делать "INSERT ... ON DUBLICATE UPDATE" по запросу "SELECT * WHERE ChangeStamp > ДатаПоследнейСинхронизации", поле ChangeStamp во всех таблицах timestamp update on change
И это можно переложить на ETL сервер.

Думаю, что следующим шагом станет изучение OLAP.

PS. Если интересно, можете изучить проект на Pentaho. www.biwed.ru/index.php/pentaho . Многие вопросы разбираю, но не все, которые вы задали. В частности показываю как спроектировать ETL процесс, создать простенький DWH и создать простой OLAP куб, для анализа данных. Данные заливаю из одной БД Mysql в другую. Причем можно использовать разные СУБД.

С уважением,
biwed.ru
...
Рейтинг: 0 / 0
Как организовать связь между звездой: Центральная база - Много второстепенных баз
    #38676671
m1andry
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Arm79,
Спасибо, почитал про GUID, возникло несколько вопросов:
1) В MySQL реализация поля только через CHAR(30)?
2) Можно ли сделать autoincrement без передачи GUID со стороны клиента?
3) Насколько понял, существует проблема с кластеризацией индексов, и соответственно со временем операций?
...
Рейтинг: 0 / 0
Как организовать связь между звездой: Центральная база - Много второстепенных баз
    #38676674
m1andry
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
biwed.ru,

Вы меня извините, но больше смахивает на рекламу вашего проекта, чем совет по существу.
...
Рейтинг: 0 / 0
Как организовать связь между звездой: Центральная база - Много второстепенных баз
    #38676686
Arm79
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
...
Рейтинг: 0 / 0
Как организовать связь между звездой: Центральная база - Много второстепенных баз
    #38676722
m1andry
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Arm79,

Благодарю за информацию.
Не смог там найти ответ на вопрос по поводу возможности autoincrement GUID, нельзя ли, к примеру, установить для поля значение по умолчанию UUID()?
Или перед INSERT обязательно нужно будет выполнить SELECT UUID()?

И еще вопрос по типу данных, использовать все же нужно VARCHAR(38) 16 байт?
varchar для PK и для индексов ведь не самое лучшее решение?
...
Рейтинг: 0 / 0
Как организовать связь между звездой: Центральная база - Много второстепенных баз
    #38676727
Arm79
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
m1andryустановить для поля значение по умолчанию UUID()?
Напрямую нет, но можно триггер на before_insert

Вот, я в яндексах нашел:
Код: sql
1.
2.
3.
4.
CREATE TRIGGER before_insert_app_users
  BEFORE INSERT ON app_users 
  FOR EACH ROW
  SET new.api_key = uuid();



m1andryиспользовать все же нужно VARCHAR(38)
Почему бы и нет?

m1andryvarchar для PK и для индексов ведь не самое лучшее решение?
Правильно, не лучшее. Но и не самое плохое. Разница будет видна на очень больших объемах. А если периодически для поля с GUID делать перестроение индексов, то и "кластеризация индексов" не будет являться проблемой.
...
Рейтинг: 0 / 0
Как организовать связь между звездой: Центральная база - Много второстепенных баз
    #38676733
m1andry
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Arm79,

Как-то у меня с триггерами не заладилось, первое знакомство с ними приводили к тому, что внесение данных в базу занимало очень много ресурсов и практически вешало железо, да и навешивать триггеры на n-нное количество таблиц - долгая процедура, когда можно в одном месте кода просто добавить (ID, ...) VALUES (UUID(), ...)

Тут другой момент возникает, как относитесь к такой информации по индексам:
binary(16) как guid

И еще вот нашел про UUID_SHORT(), но еще не понял, за счет чего он формируется.
...
Рейтинг: 0 / 0
Как организовать связь между звездой: Центральная база - Много второстепенных баз
    #38676734
m1andry
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Да что ж тут нельзя свои сообщения то редактировать?
Вот про http://dev.mysql.com/doc/refman/5.1/en/miscellaneous-functions.html#function_uuid-short
...
Рейтинг: 0 / 0
Как организовать связь между звездой: Центральная база - Много второстепенных баз
    #38676741
m1andry
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
m1andry,

А вот про производительность :

I’ve created MyISAM tables containing just integer auto_increment primary key and containing char(36) value and used for UUID primary key and when I populated it with 268.435.456 rows (large enough for that 512M box to be disk bound). For auto_increment key load process took 1 hour 50 minutes giving load speed of 40305 rows/sec. For UUID process took over 12 hours and is still going. From MySQL status I can see it is loading about 200 rows/sec and the it is still slowing down a bit as key file growths. So in this little case we have about 200 times performance difference which is worth to consider
...
Рейтинг: 0 / 0
Как организовать связь между звездой: Центральная база - Много второстепенных баз
    #38676809
biwed.ru
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
m1andry,
Добрый день.
m1andrybiwed.ru,

Вы меня извините, но больше смахивает на рекламу вашего проекта, чем совет по существу.
Возможно вы и правы, просто хотел написать в трех словах, есть ли смысл заходить по ссылке (вижу для вас нет).
В посте выше шла речь о ETL серверах, возможно там все сделать будет проще чем на PHP. Хотя дело ваше. ТЗ есть ТЗ.

biwed.ruДля primary использовать суррогатный ключ. а BaseID (код второстепенной базы) + TableID (обычный AI key) Альтернативный.
Сори. Это не ваш вариант. Перечитал ваше задание еще раз. Это для стандартный прием для DWH, но не для "реплики".

С уважением,
biwed.ru
...
Рейтинг: 0 / 0
Как организовать связь между звездой: Центральная база - Много второстепенных баз
    #38676834
17-77
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
m1andryСделать составной primary из BaseID (код второстепенной базы) + TableID (обычный AI key)?
либо guid, либо составной ключ во всех синхронизируемых таблицах
если надо еще разграничить права доступа (тетя Маша из филиала №1 не может переименовать запись тети Клавы в филиале №2) - тогда только составной ключ

Arm79почитайте http://habrahabr.ru/post/31632/
бредо-статья:
1. я тоже не делаю 11 обращений к базе, когда создаю записи с PK int
2. написал выше, если нужны разграничения прав доступа - без "ид филиала" не обойтись
3. да, тут полезная штука
...
Рейтинг: 0 / 0
Как организовать связь между звездой: Центральная база - Много второстепенных баз
    #38676838
Arm79
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
m1andryКак-то у меня с триггерами не заладилось, первое знакомство с ними приводили к тому, что внесение данных в базу занимало очень много ресурсов и практически вешало железо
Ничего не могу сказать, возможно вы просто не умеете их писать?
m1andryТут другой момент возникает, как относитесь к такой информации по индексам:
binary(16) как guid
Никак. Например, в MS SQL никаких побочных эффектов не видел

Сделайте проще - тестовая таблица с триггером и прогоните тесты. потом уж принимайте решение о том, подходит что-то вам или нет
m1andrySo in this little case we have about 200 times performance difference which is worth to consider
Если у вас генерация сотен миллионов записей - частая операция, то тогда guid не подходит
17-771. я тоже не делаю 11 обращений к базе, когда создаю записи с PK int
я тоже, но для этого приходится немного приложить усилий
17-772. написал выше, если нужны разграничения прав доступа - без "ид филиала" не обойтись
не 100%. реплика может хранить те же права доступа
...
Рейтинг: 0 / 0
Как организовать связь между звездой: Центральная база - Много второстепенных баз
    #38677136
m1andry
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Arm79не 100%. реплика может хранить те же права доступа

Как это организовать?
Просто пока склоняюсь все же к GUID, так как это практически не приведет к перестройке структуры базы данных и кода, просто заменить текущие поля ID INT на CHAR(30) и сделать "SET ID=UUID()", но не понимаю, как сделать разграничение доступа по базам без введения дополнительной колонки BaseID, а если ее уже и вводить, то спокойно можно уже и составной ключ делать.
...
Рейтинг: 0 / 0
Как организовать связь между звездой: Центральная база - Много второстепенных баз
    #38677205
Arm79
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
m1andryArm79не 100%. реплика может хранить те же права доступа
Как это организовать?
А что такого-то? Доступ даете не пользователям, а группам.

Вы на примере поясните, в чем видите сложность...
...
Рейтинг: 0 / 0
Как организовать связь между звездой: Центральная база - Много второстепенных баз
    #38677263
m1andry
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Arm79Вы на примере поясните, в чем видите сложность...

Ну к примеру, с локальной базы №1 заливаются данные в центральную, как пользователям группы №1 с правами доступа к локальной базе №1 ограничить данные к данным из локальной базы №2?
Нужно ведь поле, по которому можно будет идентифицировать, из какой базы зашли данные в центральную?
Или можно как-то воспользоваться только GUID?
...
Рейтинг: 0 / 0
Как организовать связь между звездой: Центральная база - Много второстепенных баз
    #38677360
Arm79
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
m1andryиз какой базы зашли данные в центральную
1) а почему ваши пользователи работают с центральной вместо своей локальной реплики?
2) и почему вообще надо что-то ограничивать?
...
Рейтинг: 0 / 0
Как организовать связь между звездой: Центральная база - Много второстепенных баз
    #38677429
m1andry
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Arm79m1andryиз какой базы зашли данные в центральную
1) а почему ваши пользователи работают с центральной вместо своей локальной реплики?
2) и почему вообще надо что-то ограничивать?

1) Пользователи каждый работает в своей локальной базе.
Раз в сутки данные с локальной отправляются в центральную.
2) Нужно понимать, с какой базы зашла информация, как по GUID можно определить отправителя информации (№ локальной базы) в центральную базу?
...
Рейтинг: 0 / 0
Как организовать связь между звездой: Центральная база - Много второстепенных баз
    #38677482
Arm79
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
m1andry1) Пользователи каждый работает в своей локальной базе.
Раз в сутки данные с локальной отправляются в центральную.
Значит, необходимости ограничивать что-либо отсутствует, так? Ведь в локальной реплике доступ есть, а к остальным априори отсутствует

m1andry2) Нужно понимать, с какой базы зашла информация, как по GUID можно определить отправителя информации (№ локальной базы) в центральную базу?
Зачем? Если требуется знать, в центральной БД нужно поле ReplicaID. Вы пока не обосновали, зачем вам...
...
Рейтинг: 0 / 0
Как организовать связь между звездой: Центральная база - Много второстепенных баз
    #38677690
m1andry
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Arm79Зачем? Если требуется знать, в центральной БД нужно поле ReplicaID. Вы пока не обосновали, зачем вам...

Для разграничения прав пользователей.
Пользователи локальной базы №1 не должны видеть данные локальной базы №2, при этом у всех одна общая база, которая синхронизируется через центральную.
Вот и я о том же, обязательно нужно поле ReplicaID, обойтись только GUID для идентификации, откуда зашло, нельзя?
...
Рейтинг: 0 / 0
Как организовать связь между звездой: Центральная база - Много второстепенных баз
    #38677702
Arm79
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
m1andryПользователи локальной базы №1 не должны видеть данные локальной базы №2
У вас двусторонняя репликация? Вы что, клиентские данные распространяете по всем репликам? Я просто не понимаю, какие именно данные вы собираетесь прятать? Если пользователи где-то далеко имеют доступ только к своей реплике, что вам мешает на ту реплику слать только нужные данные?
...
Рейтинг: 0 / 0
Как организовать связь между звездой: Центральная база - Много второстепенных баз
    #38677978
m1andry
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Arm79,

Да, двухсторонняя. Из центральной в локальные возвращаются обновленные общие справочники.

Кроме того, некоторым пользователям нужно давать доступ не только к своей локальной, но и к примеру соседним базам.
На простом примере из другой теоретической области это выглядит так: каждое территориальное подразделение видит только свою локальную базу, в рамках одной территориальной единицы (города/области) региональные директора видят информацию по всем своим территориальным подразделениям, в рамках всех территориальных подразделений генеральный директор видит всю информацию. Так же в подчинении генерального директора могут быть зам. директора по нескольким регионам.
В виде схему можно выразить следующим образом:

.........................Генеральный директор.......................
......................./.................|.................\..................
..................Зам1...............Зам2...............Зам3...........
.............../....|....\........../....|....\.........../....|....\.......
...........РД1..РД2..РД3...РД4..РД5..РД6...РД7..РД8..РД8..
......../...|...\...........
.......П1..П2..П3.......

Где РД - региональный директор
П - подразделения

И подразделение П1 не должно видеть данные, введенные П2, а региональный директор 1 не должен видеть данные региона №2.
Т.е. нужно разграничить права доступа по ID локальной базы, но как его вшить в UUID?
Нашел, что вроде как UUID_SHORT() формируется на основе id_server + time_serber + autoincrement, но не могу понять, где настраивать id_server и как будет меняться от этого UUID_SHORT().
...
Рейтинг: 0 / 0
25 сообщений из 36, страница 1 из 2
Форумы / MySQL [игнор отключен] [закрыт для гостей] / Как организовать связь между звездой: Центральная база - Много второстепенных баз
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]