|
|
|
Как организовать связь между звездой: Центральная база - Много второстепенных баз
|
|||
|---|---|---|---|
|
#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 |
|
||
|
Как организовать связь между звездой: Центральная база - Много второстепенных баз
|
|||
|---|---|---|---|
|
#18+
m1andryUUID_SHORT() не стоит использовать... код подразделения нужно вводить... как минимум в центральную БД ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.06.2014, 09:30:07 |
|
||
|
Как организовать связь между звездой: Центральная база - Много второстепенных баз
|
|||
|---|---|---|---|
|
#18+
Arm79m1andryUUID_SHORT() не стоит использовать... код подразделения нужно вводить... как минимум в центральную БД Тоже сомневаюсь насчет него, так как неясна природа создания этого "случайно уникального" числа, но подкупает то, что тип поля INT, т.е. не прийдется перелопачивать весь код для внесения изменений с работой по ID типа String. А как по-вашему мнению, почему UUID_SHORT() не стоит использовать? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.06.2014, 12:10:16 |
|
||
|
Как организовать связь между звездой: Центральная база - Много второстепенных баз
|
|||
|---|---|---|---|
|
#18+
m1andry... не прийдется перелопачивать весь код для внесения изменений с работой по ID типа String. У меня плейсхолдеры на ID везде ?i, но это то, что на поверхности. Пока не до конца осознаю, во что еще может вылиться смена первичного ключа на String. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.06.2014, 12:12:27 |
|
||
|
Как организовать связь между звездой: Центральная база - Много второстепенных баз
|
|||
|---|---|---|---|
|
#18+
Arm79не стоит использовать... Вот кстати еще один повод для сомнений. Никак не пойму, отчего в MySQL столько мелочей-недоработок? Почему нет возможности стандартными средствами хранить дерево в таблицах, а нужно мудрить костыли с Nested Tree? Почему до 5.5 только на одно поле Timestamp можно было вешать CURRENT_TIMESTAMP? Почему не оптимизирована работа с UUID (хранение, индексация, кластеризация и т.д.)? Но это так, крик души) Кстати, не посоветуете какой-нибудь простенький класс для работы с Nested Tree? Может сталкивались. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.06.2014, 12:17:49 |
|
||
|
Как организовать связь между звездой: Центральная база - Много второстепенных баз
|
|||
|---|---|---|---|
|
#18+
А вот кстати по поводу кластеризации, оказывается в UUID_SHORT можно настраивать порядок формирования значения , т.е. что бы сначала шел timestamp вместо server_id, ну и наоборот. Скажите пожалуйста, где выставляется этот самый server_id? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.06.2014, 12:23:04 |
|
||
|
Как организовать связь между звездой: Центральная база - Много второстепенных баз
|
|||
|---|---|---|---|
|
#18+
m1andryА как по-вашему мнению, почему UUID_SHORT() не стоит использовать? Из-за этого: The value of UUID_SHORT() is guaranteed to be unique if the following conditions hold: * The server_id of the current host is unique among your set of master and slave servers * Server_id is between 0 and 255 * You do not set back your system time for your server between mysqld restarts * You do not invoke UUID_SHORT() on average more than 16 million times per second between mysqld restarts Не переводить время, ограничения на ServerId, требование уникальности имени северов только в рамках вашей системы. В общем, если это не смущает, то можно выбирать. m1andryНикак не пойму, отчего в MySQL столько мелочей-недоработок? Покупайте Oracle или MS SQL :-) m1andryПочему нет возможности стандартными средствами хранить дерево в таблицах, а нужно мудрить костыли с Nested Tree? Это какие такие "стандартные" средства? Nested Tree - это лишь тип дерева, который реализуется везде. Чем вас не устраивает стандартные Id - ParentId? m1andryПочему не оптимизирована работа с UUID (хранение, индексация, кластеризация и т.д.)? Почему не оптимизирована? Вы с чем сравниваете то? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.06.2014, 14:30:43 |
|
||
|
Как организовать связь между звездой: Центральная база - Много второстепенных баз
|
|||
|---|---|---|---|
|
#18+
Если нужны какие-то тонко-настроеные права доступа, то имеет смысл создать отдельную колонку created_by или,например source_db_id. Вычислять на лету источник из ГУИД , я думаю, будет небыстро (по сравнению с отдельной проиндексированой колонкой) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.06.2014, 16:17:32 |
|
||
|
Как организовать связь между звездой: Центральная база - Много второстепенных баз
|
|||
|---|---|---|---|
|
#18+
javajdbcЕсли нужны какие-то тонко-настроеные права доступа, то имеет смысл создать отдельную колонку created_by или,например source_db_id. Вычислять на лету источник из ГУИД , я думаю, будет небыстро (по сравнению с отдельной проиндексированой колонкой) Подскажете, какое Ваше мнение насчет UUID() в качестве PK? Все-таки CHAR(30), насколько удачно применять строчный первичный ключ? Не будет заметной потери в производительности, если есть куча JOIN ON ID=parentID? И также куча таблиц-связок одна-ко-многим (ID1, ID2), опять же, занимаемое место, или можно пренебречь? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.06.2014, 14:37:40 |
|
||
|
Как организовать связь между звездой: Центральная база - Много второстепенных баз
|
|||
|---|---|---|---|
|
#18+
Arm79m1andryПочему не оптимизирована работа с UUID (хранение, индексация, кластеризация и т.д.)? Почему не оптимизирована? Вы с чем сравниваете то? Сравниваю с обычным INT, или ошибаюсь? INT PK при AI пишется в индексе в конец, так как ID идет по возрастающей, а вот что будет с UUID, который постоянно генерируется с бухты-барахты? Как вообще реализуется в крупных проектах PK? INT или делают и UUID? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.06.2014, 14:40:18 |
|
||
|
Как организовать связь между звездой: Центральная база - Много второстепенных баз
|
|||
|---|---|---|---|
|
#18+
m1andryСравниваю с обычным INT, или ошибаюсь? INT PK при AI пишется в индексе в конец, так как ID идет по возрастающей, а вот что будет с UUID, который постоянно генерируется с бухты-барахты? Как вообще реализуется в крупных проектах PK? INT или делают и UUID? Смысл сравнивать с Int? Разумеется, ключ с последовательным рядом гораздо предпочтительнее. Для Guid в MS SQL сделали функцию NewSequentialId , которая возвращает уникальные возрастающие значения. Для MySql мне такой функции неизвестно. С другой стороны, и я писал об этом ранее, недостатки GUID в данном контексте исправляются периодической переиндексацией. Как в остальных крупных проектах мне неизвестно, но у меня GUID на всех таблицах (сущностях), которые могут участвовать в интеграции (включая репликацию), а это пользователи, заказы; а int - на незначащих таблицах. Например, разосланные e-mail, или записи в журнале событий, или классификаторы (словари), если нет натурального ключа, или идентификаторы объявлений... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.06.2014, 14:51:19 |
|
||
|
Как организовать связь между звездой: Центральная база - Много второстепенных баз
|
|||
|---|---|---|---|
|
#18+
m1andryjavajdbcЕсли нужны какие-то тонко-настроеные права доступа, то имеет смысл создать отдельную колонку created_by или,например source_db_id. Вычислять на лету источник из ГУИД , я думаю, будет небыстро (по сравнению с отдельной проиндексированой колонкой) Подскажете, какое Ваше мнение насчет UUID() в качестве PK? Все-таки CHAR(30), насколько удачно применять строчный первичный ключ? Не будет заметной потери в производительности, если есть куча JOIN ON ID=parentID? И также куча таблиц-связок одна-ко-многим (ID1, ID2), опять же, занимаемое место, или можно пренебречь? Волею судьбы у меня был только единичный случай работы ГУИД, посему сравнивать не могу. Мой пост был скорее про логику -- по вашим словам надо как то различать записи пришедших в центр из разных баз. Это дополнительная задача к очевидной задачи уникальности ИД в интегрированом контексте. Вариантов примерно 3: 1. ид -- ГУИД или ГУИД+сервер_ид, исходную базу расшифровывать из ГУИД 2. ид -- составнойй ключ = локальный автоинкремент и сервер_ид 3. ид -- ГУИД и отдельное поле сервер_ид Вариант 1 мне кажется неуклюжим -- необходимо расшифровывать на лету, плохая производительность Вариант 2. составной ключ не очень удобен для многих фрейворков. Вариант 3 обеспечивает оба функционала -- возможно слегка избыточная информация ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.06.2014, 19:20:33 |
|
||
|
|

start [/forum/topic.php?all=1&fid=47&tid=1834612]: |
0ms |
get settings: |
10ms |
get forum list: |
15ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
51ms |
get topic data: |
10ms |
get forum data: |
2ms |
get page messages: |
70ms |
get tp. blocked users: |
1ms |
| others: | 221ms |
| total: | 386ms |

| 0 / 0 |
