|
|
|
Как организовать связь между звездой: Центральная база - Много второстепенных баз
|
|||
|---|---|---|---|
|
#18+
Можно было бы пойти по простому пути и сделать репликацию, но задача несколько иная. Есть центральная база, в которую раз в сутки подтягиваются данные со всех второстепенных (количество второстепенных не должно иметь значение, полная масшабируемость). А потом с главной второстепенным расдается несколько общих справочников (клиенты и т.д.). К примеру, во второстепенной базе №1 и №2 были добавлены свои клиенты, по ним созданы заказы и т.д. В 00:00 происходит отправка в центральную базу (думаю сделать скрипт синхронизации PHP и повесить на крон) со второстепенных баз всех изменений за день. Затем в 01:00 со всех второстепенных баз делается запрос в центральную на обновление таблицы клиентов, и они получают в ответ все изменения (добавления/редактирования/удаления). Но тут у меня возникает вопрос, как быть с primary key, что бы избежать дублей при получении данных со второстепенных баз? Сделать составной primary из BaseID (код второстепенной базы) + TableID (обычный AI key)? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.06.2014, 03:21:05 |
|
||
|
Как организовать связь между звездой: Центральная база - Много второстепенных баз
|
|||
|---|---|---|---|
|
#18+
UPD. Отдельная проблема возникает с пониманием синхронизации со второстепенной базы таблиц пересечений (т.е. где хранятся связи таблиц, к примеру структура таблицы Order: ClientID, ProductID), как быть с ней? Вешать OrderID + BaseID на такую таблицу, которые до этого по сути вообще были не нужны? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.06.2014, 03:34:36 |
|
||
|
Как организовать связь между звездой: Центральная база - Много второстепенных баз
|
|||
|---|---|---|---|
|
#18+
UPD. Синхронизацию думал делать "INSERT ... ON DUBLICATE UPDATE" по запросу "SELECT * WHERE ChangeStamp > ДатаПоследнейСинхронизации", поле ChangeStamp во всех таблицах timestamp update on change ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.06.2014, 03:49:32 |
|
||
|
Как организовать связь между звездой: Центральная база - Много второстепенных баз
|
|||
|---|---|---|---|
|
#18+
Primary key - GUID ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.06.2014, 10:42:01 |
|
||
|
Как организовать связь между звездой: Центральная база - Много второстепенных баз
|
|||
|---|---|---|---|
|
#18+
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 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.06.2014, 15:56:06 |
|
||
|
Как организовать связь между звездой: Центральная база - Много второстепенных баз
|
|||
|---|---|---|---|
|
#18+
Arm79, Спасибо, почитал про GUID, возникло несколько вопросов: 1) В MySQL реализация поля только через CHAR(30)? 2) Можно ли сделать autoincrement без передачи GUID со стороны клиента? 3) Насколько понял, существует проблема с кластеризацией индексов, и соответственно со временем операций? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.06.2014, 19:20:56 |
|
||
|
Как организовать связь между звездой: Центральная база - Много второстепенных баз
|
|||
|---|---|---|---|
|
#18+
biwed.ru, Вы меня извините, но больше смахивает на рекламу вашего проекта, чем совет по существу. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.06.2014, 19:21:59 |
|
||
|
Как организовать связь между звездой: Центральная база - Много второстепенных баз
|
|||
|---|---|---|---|
|
#18+
m1andry, почитайте http://habrahabr.ru/post/31632/ + http://dev.mysql.com/doc/refman/5.1/en/miscellaneous-functions.html#function_uuid ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.06.2014, 20:22:03 |
|
||
|
Как организовать связь между звездой: Центральная база - Много второстепенных баз
|
|||
|---|---|---|---|
|
#18+
Arm79, Благодарю за информацию. Не смог там найти ответ на вопрос по поводу возможности autoincrement GUID, нельзя ли, к примеру, установить для поля значение по умолчанию UUID()? Или перед INSERT обязательно нужно будет выполнить SELECT UUID()? И еще вопрос по типу данных, использовать все же нужно VARCHAR(38) 16 байт? varchar для PK и для индексов ведь не самое лучшее решение? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.06.2014, 22:43:54 |
|
||
|
Как организовать связь между звездой: Центральная база - Много второстепенных баз
|
|||
|---|---|---|---|
|
#18+
m1andryустановить для поля значение по умолчанию UUID()? Напрямую нет, но можно триггер на before_insert Вот, я в яндексах нашел: Код: sql 1. 2. 3. 4. m1andryиспользовать все же нужно VARCHAR(38) Почему бы и нет? m1andryvarchar для PK и для индексов ведь не самое лучшее решение? Правильно, не лучшее. Но и не самое плохое. Разница будет видна на очень больших объемах. А если периодически для поля с GUID делать перестроение индексов, то и "кластеризация индексов" не будет являться проблемой. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.06.2014, 22:59:26 |
|
||
|
Как организовать связь между звездой: Центральная база - Много второстепенных баз
|
|||
|---|---|---|---|
|
#18+
Arm79, Как-то у меня с триггерами не заладилось, первое знакомство с ними приводили к тому, что внесение данных в базу занимало очень много ресурсов и практически вешало железо, да и навешивать триггеры на n-нное количество таблиц - долгая процедура, когда можно в одном месте кода просто добавить (ID, ...) VALUES (UUID(), ...) Тут другой момент возникает, как относитесь к такой информации по индексам: binary(16) как guid И еще вот нашел про UUID_SHORT(), но еще не понял, за счет чего он формируется. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.06.2014, 23:16:46 |
|
||
|
Как организовать связь между звездой: Центральная база - Много второстепенных баз
|
|||
|---|---|---|---|
|
#18+
Да что ж тут нельзя свои сообщения то редактировать? Вот про http://dev.mysql.com/doc/refman/5.1/en/miscellaneous-functions.html#function_uuid-short ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.06.2014, 23:17:56 |
|
||
|
Как организовать связь между звездой: Центральная база - Много второстепенных баз
|
|||
|---|---|---|---|
|
#18+
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 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.06.2014, 23:40:30 |
|
||
|
Как организовать связь между звездой: Центральная база - Много второстепенных баз
|
|||
|---|---|---|---|
|
#18+
m1andry, Добрый день. m1andrybiwed.ru, Вы меня извините, но больше смахивает на рекламу вашего проекта, чем совет по существу. Возможно вы и правы, просто хотел написать в трех словах, есть ли смысл заходить по ссылке (вижу для вас нет). В посте выше шла речь о ETL серверах, возможно там все сделать будет проще чем на PHP. Хотя дело ваше. ТЗ есть ТЗ. biwed.ruДля primary использовать суррогатный ключ. а BaseID (код второстепенной базы) + TableID (обычный AI key) Альтернативный. Сори. Это не ваш вариант. Перечитал ваше задание еще раз. Это для стандартный прием для DWH, но не для "реплики". С уважением, biwed.ru ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.06.2014, 03:30:56 |
|
||
|
Как организовать связь между звездой: Центральная база - Много второстепенных баз
|
|||
|---|---|---|---|
|
#18+
m1andryСделать составной primary из BaseID (код второстепенной базы) + TableID (обычный AI key)? либо guid, либо составной ключ во всех синхронизируемых таблицах если надо еще разграничить права доступа (тетя Маша из филиала №1 не может переименовать запись тети Клавы в филиале №2) - тогда только составной ключ Arm79почитайте http://habrahabr.ru/post/31632/ бредо-статья: 1. я тоже не делаю 11 обращений к базе, когда создаю записи с PK int 2. написал выше, если нужны разграничения прав доступа - без "ид филиала" не обойтись 3. да, тут полезная штука ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.06.2014, 07:36:48 |
|
||
|
Как организовать связь между звездой: Центральная база - Много второстепенных баз
|
|||
|---|---|---|---|
|
#18+
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%. реплика может хранить те же права доступа ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.06.2014, 07:52:26 |
|
||
|
Как организовать связь между звездой: Центральная база - Много второстепенных баз
|
|||
|---|---|---|---|
|
#18+
Arm79не 100%. реплика может хранить те же права доступа Как это организовать? Просто пока склоняюсь все же к GUID, так как это практически не приведет к перестройке структуры базы данных и кода, просто заменить текущие поля ID INT на CHAR(30) и сделать "SET ID=UUID()", но не понимаю, как сделать разграничение доступа по базам без введения дополнительной колонки BaseID, а если ее уже и вводить, то спокойно можно уже и составной ключ делать. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.06.2014, 13:17:18 |
|
||
|
Как организовать связь между звездой: Центральная база - Много второстепенных баз
|
|||
|---|---|---|---|
|
#18+
m1andryArm79не 100%. реплика может хранить те же права доступа Как это организовать? А что такого-то? Доступ даете не пользователям, а группам. Вы на примере поясните, в чем видите сложность... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.06.2014, 13:49:31 |
|
||
|
Как организовать связь между звездой: Центральная база - Много второстепенных баз
|
|||
|---|---|---|---|
|
#18+
Arm79Вы на примере поясните, в чем видите сложность... Ну к примеру, с локальной базы №1 заливаются данные в центральную, как пользователям группы №1 с правами доступа к локальной базе №1 ограничить данные к данным из локальной базы №2? Нужно ведь поле, по которому можно будет идентифицировать, из какой базы зашли данные в центральную? Или можно как-то воспользоваться только GUID? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.06.2014, 14:11:43 |
|
||
|
Как организовать связь между звездой: Центральная база - Много второстепенных баз
|
|||
|---|---|---|---|
|
#18+
m1andryиз какой базы зашли данные в центральную 1) а почему ваши пользователи работают с центральной вместо своей локальной реплики? 2) и почему вообще надо что-то ограничивать? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.06.2014, 14:50:15 |
|
||
|
Как организовать связь между звездой: Центральная база - Много второстепенных баз
|
|||
|---|---|---|---|
|
#18+
Arm79m1andryиз какой базы зашли данные в центральную 1) а почему ваши пользователи работают с центральной вместо своей локальной реплики? 2) и почему вообще надо что-то ограничивать? 1) Пользователи каждый работает в своей локальной базе. Раз в сутки данные с локальной отправляются в центральную. 2) Нужно понимать, с какой базы зашла информация, как по GUID можно определить отправителя информации (№ локальной базы) в центральную базу? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.06.2014, 15:26:15 |
|
||
|
Как организовать связь между звездой: Центральная база - Много второстепенных баз
|
|||
|---|---|---|---|
|
#18+
m1andry1) Пользователи каждый работает в своей локальной базе. Раз в сутки данные с локальной отправляются в центральную. Значит, необходимости ограничивать что-либо отсутствует, так? Ведь в локальной реплике доступ есть, а к остальным априори отсутствует m1andry2) Нужно понимать, с какой базы зашла информация, как по GUID можно определить отправителя информации (№ локальной базы) в центральную базу? Зачем? Если требуется знать, в центральной БД нужно поле ReplicaID. Вы пока не обосновали, зачем вам... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.06.2014, 15:43:53 |
|
||
|
Как организовать связь между звездой: Центральная база - Много второстепенных баз
|
|||
|---|---|---|---|
|
#18+
Arm79Зачем? Если требуется знать, в центральной БД нужно поле ReplicaID. Вы пока не обосновали, зачем вам... Для разграничения прав пользователей. Пользователи локальной базы №1 не должны видеть данные локальной базы №2, при этом у всех одна общая база, которая синхронизируется через центральную. Вот и я о том же, обязательно нужно поле ReplicaID, обойтись только GUID для идентификации, откуда зашло, нельзя? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.06.2014, 17:22:52 |
|
||
|
Как организовать связь между звездой: Центральная база - Много второстепенных баз
|
|||
|---|---|---|---|
|
#18+
m1andryПользователи локальной базы №1 не должны видеть данные локальной базы №2 У вас двусторонняя репликация? Вы что, клиентские данные распространяете по всем репликам? Я просто не понимаю, какие именно данные вы собираетесь прятать? Если пользователи где-то далеко имеют доступ только к своей реплике, что вам мешает на ту реплику слать только нужные данные? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.06.2014, 17:33:51 |
|
||
|
Как организовать связь между звездой: Центральная база - Много второстепенных баз
|
|||
|---|---|---|---|
|
#18+
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(). ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.06.2014, 01:52:42 |
|
||
|
|

start [/forum/topic.php?fid=47&msg=38677360&tid=1834612]: |
0ms |
get settings: |
8ms |
get forum list: |
14ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
116ms |
get topic data: |
8ms |
get forum data: |
2ms |
get page messages: |
72ms |
get tp. blocked users: |
1ms |
| others: | 219ms |
| total: | 446ms |

| 0 / 0 |
