
Новые сообщения [новые:0]
Дайджест
Горячие темы
Избранное [новые:0]
Форумы
Пользователи
Статистика
Статистика нагрузки
Мод. лог
Поиск
|
|
12.05.2009, 17:30
|
|||
|---|---|---|---|
|
|||
Распределенная база на много организаций слияние |
|||
|
#18+
Есть множество филиалов/организаций (больше 5000). Предполагается, что на всех из них будет локально установлена своя база данных Oracle. Структура баз везде полностью идентичная, справочники создаются и рассылаются централизовано, версии СУБД везде одинаковы, политика генерации ключей полностью нам подвластна. Через заданные промежутки времени, удаленные базы будут присылаться в центральный офис, где данные из одинаковых таблиц должны сливаться в одну. Например, данные из таблицы product филиала в Урюпинске сливаются с данными из таблицы product филиала в Жмеринке. Вопрос - как организовать ведение первичных ключей, для простоты слияния и легкости выборки в центральном офисе по компаниям и в целом ? Пока вижу такие варианты: 1. create table product ( ID_ORGANIZATION NUMBER, ID_PRODUCT ) С primary key на обоих полях - ID_ORGANIZATION + ID_PRODUCT. Но дальше весьма неудобно вязать эту таблицу по составному ключу с подчиненными, например, если возьмем таблицу продаж по месяцам, то у нее уже получается ключ из ID_ORGANIZATION + ID_PRODUCT + ID_SALES. 2. "Раздать" всем свой диапазон на генерацию последовательностей и оставить один ID - совсем мрак, т.к. крайне неэффективно расходуются диапазоны, увеличивается число точек возможных ошибок при слиянии (затрудняется проверка во время слияния на диапазоны, что критично) + см. вар. 3 с трудностями выборки по компании. 3. Устроить один составной ключ, состоящий из номера компании и произвольного ID - сильно замедляются выборки по конкретной компании в центральном филиале, т.к. из ID придется выдирать код компании. Есть ли более грамотные идеи? Возможно истина в том, что я неправильно выбрал саму архитектуру? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
13.05.2009, 08:31
|
|||
|---|---|---|---|
Распределенная база на много организаций слияние |
|||
|
#18+
carperфилиала в Урюпинске Что вы все привязались к нашему городку? Уже издавна используем "составной" ИД, он у нас символ... Но это прокатывает поскольку у нас не более 50-ти филиалов в каждом регионе... Работать с этим не очень приятно, т.ч. думаю раздельные поля "филиал" и "местный ИД" лучше. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
13.05.2009, 09:12
|
|||
|---|---|---|---|
|
|||
Распределенная база на много организаций слияние |
|||
|
#18+
Неудобно вязать с подчиненными? Почему бы не сделать так, чтобы в каждой таблице PK состоял только из ID_ORGANIZATION и суррогатного ID_XXX ? Тогда при вязке с подчиненными не будет плодиться число полей. А альтернативные ключи (UNIQUE) - там сколько необходимо полей, по задаче. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
13.05.2009, 09:15
|
|||
|---|---|---|---|
|
|||
Распределенная база на много организаций слияние |
|||
|
#18+
krvsa Уже издавна используем "составной" ИД, он у нас символ... Но это прокатывает поскольку у нас не более 50-ти филиалов в каждом регионе... Работать с этим не очень приятно, т.ч. думаю раздельные поля "филиал" и "местный ИД" лучше. Я так сейчас и делаю (ID из пары полей), но это очень неудобно, с точки зрения читаемости, как минимум. Пробовал делать "составной" ID, но замедляется выборка в центральном офисе при select'ах по конкретным организациям. :( ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
13.05.2009, 09:32
|
|||
|---|---|---|---|
|
|||
Распределенная база на много организаций слияние |
|||
|
#18+
Cane Cat FisherНеудобно вязать с подчиненными? Почему бы не сделать так, чтобы в каждой таблице PK состоял только из ID_ORGANIZATION и суррогатного ID_XXX ? Тогда при вязке с подчиненными не будет плодиться число полей. А альтернативные ключи (UNIQUE) - там сколько необходимо полей, по задаче. Думал. Но это только отодвигает проблему выборки по конкретной организации на уровень подчиненной таблицы. Если я вас правильно понял, то предлагается сделать нечто вроде: create table product( ID_ORG_SEQ_NUMBER, -- Составное уникальное поле из номера организации и числа из последовательности ID_ORGANIZATION - Облегчает выборку по организации, правда за счет денормализации ) create table sales( ID, -- privary key (можно тоже составной, типа ID_ORG_SEQ_NUMBER) ID_ORG_SEQ_NUMBER, -- поскольку уникальное, то ID_ORGANIZATION тащить сюда не надо ..... "значимые поля" ) Проблема выборки по организациям просто сместилась с уровня таблицы product на уровень sales. Чтобы выбрать какие-то данные из sales по конкретной организации мне надо или делать "разбор" поля ID_ORG_SEQ_NUMBER, или вязать sales с product: select a.* from salse a, product b where a.ID_ORG_SEQ_NUMBER = b.ID_ORG_SEQ_NUMBER and b.ID_ORGANIZATION = "нужный ID" В общем-то не смертельно, но согласитесь, что назвать выборку из двух таблиц, вместо одной, только ради отбора по организации, изящным решением не выглядит. :( Это ладно, но пусть у таблицы sales есть своя дочерняя таблица, скажем salesLevel1, а у salesLevel1 таблица salesLevel2. Как будет выглядеть выборка по конкретной организации из salesLevel2 ? Как цепочка из таблиц вплоть до product ? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
13.05.2009, 10:11
|
|||
|---|---|---|---|
Распределенная база на много организаций слияние |
|||
|
#18+
carperВопрос - как организовать ведение первичных ключей, для простоты слияния и легкости выборки в центральном офисе по компаниям и в целом ? 1. Сделать ключи уникальными в пределах всех офисов. create sequence id_seq start with <office#> increment by 100000 2. Не использовать ключ как составной. Явно вводить в таблицы куда нужно поле "офис" как внешний ключ на список итп. Помимо простоты слияния и лёгкости выборки это обеспечивает ещё один аспект: иногда нужно в одном офисе создавать записи, "по бизнесу" привязанные к другому офису. Скажем: директор филиала приехал в командировку, но что-то делает "у себя". Поэтому "физическое место создания записи" не должно играть роли в бизнес-логике; оно важно только для транспортных задач. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
13.05.2009, 10:58
|
|||
|---|---|---|---|
|
|||
Распределенная база на много организаций слияние |
|||
|
#18+
softwarer 1. Сделать ключи уникальными в пределах всех офисов. create sequence id_seq start with <office#> increment by 100000 2. Не использовать ключ как составной. Явно вводить в таблицы куда нужно поле "офис" как внешний ключ на список итп. 1. Как сделать ключи уникальными проблемы нет - можно так, как вы предлагаете, можно с учетом ID организации, последнее сильно лучше, т.к. делить диапазоны поровну между 5000 организациями INHO не лучшая идея. 2. Вот по второму пункту и неясно - дело в том, что практически 80% таблиц, т.е. все, за исключением справочников, в центральном офисе будут нуждаться в отборе по организации, что при этом получается я уже написал в своем последнем посте - придется либо везде пихать ID_ORGANIZATION либо доставать эти данные из синтетического ключа. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
13.05.2009, 11:10
|
|||
|---|---|---|---|
Распределенная база на много организаций слияние |
|||
|
#18+
carper , ты не РоссТрудовскую БД по Регистрам маклачишь? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
13.05.2009, 11:21
|
|||
|---|---|---|---|
|
|||
Распределенная база на много организаций слияние |
|||
|
#18+
krvsa carper , ты не РоссТрудовскую БД по Регистрам маклачишь? Неа, чистА коммерческая задача. Все бы ничего, да только у меня сильные подозрения, что данную задачу уже решали раз 100 и из них хотя бы в 10 случаях лучше, чем мои идеи. :) Вот и взываю к вселенскому разуму. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
13.05.2009, 11:29
|
|||
|---|---|---|---|
Распределенная база на много организаций слияние |
|||
|
#18+
carperможно с учетом ID организации, последнее сильно лучше, Ну-ну. Если Вы имеете в виду составной ключ.. carper т.к. делить диапазоны поровну между 5000 организациями INHO не лучшая идея. Боитесь, number(33) не хватит, нужна вся мощь number(38)? carper2. Вот по второму пункту и неясно - дело в том, что практически 80% таблиц, т.е. все, за исключением справочников, в центральном офисе будут нуждаться в отборе по организации, что при этом получается я уже написал в своем последнем посте - придется либо везде пихать ID_ORGANIZATION либо доставать эти данные из синтетического ключа. Боюсь, Вы недооцениваете задачу "отбора по организации". Она - по бизнес-логике - сложная и будет постоянно усложняться. Может случиться так, что счёт создан в Питере, отдача по нему идёт с Ростовского склада, а нажавший кнопку человек именно сейчас в командировке в Пензе. И в зависимости от операции строка должна попадать в выборку по тому или иному офису. Поэтому "везде пихать ID_ORGANIZATION" просто необходимо, причём не просто "везде", а "везде именно такой, какой здесь по бизнесу". Иногда и не один. Синтетический ключ здесь просто неприменим, он заведомо станет проблемой в будущем, если не в настоящем. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
13.05.2009, 11:31
|
|||
|---|---|---|---|
Распределенная база на много организаций слияние |
|||
|
#18+
carperНеа, чистА коммерческая задача. А то они там тоже собирают БД от всех ЦЗН... Требуют в одном поле уникальный ключ в пределах региона, он получается составной ЦЗН+ИД и поле с кодом региона. От нас идут данные из 5 областей в которых примерно по 45 ЦЗН. Остальные регионы "обслуживают" другие разработчики. Я-то сам за вот какую схемку: РегионыКодНазвание ЦЗНыКодНазваниеКод Региона Любая другая таблицаКод ЦЗНКод (ИД записи)Другие поля Может и тебя такой подход устроит? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
13.05.2009, 12:09
|
|||
|---|---|---|---|
|
|||
Распределенная база на много организаций слияние |
|||
|
#18+
авторЯ так сейчас и делаю (ID из пары полей), но это очень неудобно, с точки зрения читаемости, как минимум. Пробовал делать "составной" ID, но замедляется выборка в центральном офисе при select'ах по конкретным организациям. :( имхо составной тут пойдет: ид организации + какой-то месный ид. + (если таки замедляется) отдельно поле FK на ид организации - несколько избыточно, зато ... удобно ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
13.05.2009, 12:41
|
|||
|---|---|---|---|
|
|||
Распределенная база на много организаций слияние |
|||
|
#18+
softwarerНу-ну. Если Вы имеете в виду составной ключ.. Разумеется, я понял иронию по поводу NUMBER(33) и разумеется хватит мне его и еще останется, но зачем нам это искусственное ограничение? Может все же "воспользоваться случаем" и заложить в синтетический ключ какую-то осмысленную информацию? Лишний так сказать дубль к полю ID_ORGANIZATION? Впрочем, как я уже писал, не суть важно. Боюсь, Вы недооцениваете задачу "отбора по организации". Она - по бизнес-логике - сложная и будет постоянно усложняться... Проблема с тем, что человек, "находясь в командировке" создаст свою запись, не стоИт, т.к. у филиалов отсутствует возможность создавать не свои записи, а для тех, кто вынужден создавать записи по разным организациям существует соотв. возможность выбора с какой он организацией работает + по логину/паролю при входе в систему ему назначается "его" филиал, что он потом явным образом может изменить. Такая схему применяется в нашей системе учета договоров, пока проблем не было. При чем здесь поле ID_ORGANIZATION? - если использовать даже ваш подход с диапазоном ключей, не ясно. Так или иначе мы знаем с какой организацией пользователь работает и генерируем ему ключ из "его диапазона", а не некий ключ "по-умолчанию" из тригера. Иногда и не один. Синтетический ключ здесь просто неприменим, он заведомо станет проблемой в будущем, если не в настоящем. Можно поподробнее: - Почему "не один" ? Можно пример, когда в одной таблице нужно несколько ID_ORGANIZATION. - Почему синтетический ключ неприменим? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
13.05.2009, 14:03
|
|||
|---|---|---|---|
Распределенная база на много организаций слияние |
|||
|
#18+
carperи разумеется хватит мне его и еще останется, но зачем нам это искусственное ограничение? Затем, что оно даёт реальную экономию относительно других вариантов. Оно самое дешёвое в смысле реализации, последующей поддержки и вероятности внесения ошибок. carperМожет все же "воспользоваться случаем" и заложить в синтетический ключ какую-то осмысленную информацию? Лишний так сказать дубль к полю ID_ORGANIZATION? Вас можно понять по-разному, поэтому отвечу аккуратно. В него уже заложена информация о "физическом месте создания записи". Она нужна для обеспечения уникальности без составного ключа, а кроме того, пригодится для транспортировки и для ручного разбора проблем. Использовать эту информацию в других бизнес-целях - чревато. Либо коллизиями (для разных задач нужны разные значения), либо "здесь играем, здесь не играем" (в варианте "здесь берём id_organization, здесь - из ключа) и неизбежными логическими ошибками и проблемами сопровождения (бизнес-логика изменилась и теперь таки надо внести поле id_organization и переписать все запросы к этой таблице). Заложить в синтетический ключ ещё дополнительные информационные поля - можно в принципе, но не думаю, что нужно. 1НФ таки придумывали не зря. Отдельные поля удобнее. С ними не возникает проблемы с индексированием, с проверкой целостности, с ними удобно писать запросы. carperПроблема с тем, что человек, "находясь в командировке" создаст свою запись, не стоИт, т.к. у филиалов отсутствует возможность создавать не свои записи, а для тех, кто вынужден создавать записи по разным организациям существует соотв. возможность выбора с какой он организацией работает + по логину/паролю при входе в систему ему назначается "его" филиал, что он потом явным образом может изменить. У нас здесь чувствуется непонимание. Не знаю, кто кого. Мы, похоже, по-разному понимаем "филиалы" и "организации". Давайте так: 1. Запись, созданная на сервере X, должна иметь X в ключе - для обеспечения уникальности. Это "физика". 2. Работа сотрудника на разных серверах - объективная реальность. Которой может не быть сейчас, но которая возникнет в будущем. Она возникает как в силу командировок, так и в силу удалённого доступа сотрудников на другие сервера (актуально для отдела ИТ, техподдержки и прочих грамотных пользователей). При этом ещё бывает "работа под видом другого человека". 3. Во всех случаях человек работает со "своей" единственной или выбранной организацией. К которой относится логически, вне зависимости от физического расположения. Вывод: нельзя делать никаких завязок между "физическим местом создания записи" и "филиалом, организацией и прочими местами, к которым запись относится логически". carperПри чем здесь поле ID_ORGANIZATION? - если использовать даже ваш подход с диапазоном ключей, не ясно. Так или иначе мы знаем с какой организацией пользователь работает и генерируем ему ключ из "его диапазона", а не некий ключ "по-умолчанию" из тригера. В результате Вы рискуете нарушить уникальность ключа между серверами, когда этот пользователь поедет между ними. В ключ либо должно входить "физическое место генерации", либо нужна некая сложная и ненадёжная система, например, "динамического выделения диапазонов другим серверам". carperМожно пример, когда в одной таблице нужно несколько ID_ORGANIZATION. Мм... "Клиент организации А, обслуживает организация Б". Например, у нас часто было, что головной офис заказчика заключает договор с нашим головным офисом, платит деньги, но реальная работа идёт в нашем филиале, обслуживающем соответствующий филиал заказчика. carper- Почему синтетический ключ неприменим? Потому что всовывать в него несколько ID будет совсем неудобно. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
13.05.2009, 14:27
|
|||
|---|---|---|---|
|
|||
Распределенная база на много организаций слияние |
|||
|
#18+
carperCane Cat FisherНеудобно вязать с подчиненными? Почему бы не сделать так, чтобы в каждой таблице PK состоял только из ID_ORGANIZATION и суррогатного ID_XXX ? Тогда при вязке с подчиненными не будет плодиться число полей. А альтернативные ключи (UNIQUE) - там сколько необходимо полей, по задаче. Думал. Но это только отодвигает проблему выборки по конкретной организации на уровень подчиненной таблицы. Если я вас правильно понял, то предлагается сделать нечто вроде: create table product( ID_ORG_SEQ_NUMBER, -- Составное уникальное поле из номера организации и числа из последовательности Совершенно неправильно поняли. Выражаюсь точнее: Почему бы не сделать так, чтобы в каждой таблице PK состоял только из двух полей : ID_ORGANIZATION и суррогатного ID_XXX ? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
13.05.2009, 15:26
|
|||
|---|---|---|---|
|
|||
Распределенная база на много организаций слияние |
|||
|
#18+
softwarer, Запутался, давайте попробуем разобраться, если не сложно. авторЗапись, созданная на сервере X, должна иметь X в ключе - для обеспечения уникальности. Это "физика". Что понимаем под "X в ключе" ? - "Свой диапазон" + ID_ORGANIZATION - Только "Свой диапазон" Зачем привязывать "X" к серверу? Мне кажется нужна привязка к организации, а уж на одном сервере (хоть железе, хоть ПО) может сидеть несколько организаций. авторИспользовать эту информацию в других бизнес-целях - чревато. Если мы рассматриваем ID организации как синтетический ключ, а именно так мы ее и рассматриваем, то чем чревато "сцепление" 2-х синтетических ключей и возможность выборки по части такого ключа? Ну кроме "либо "здесь играем, здесь не играем" (в варианте "здесь берём id_organization, здесь - из ключа". Хм..., впрочем, если мы таки примем поле ID_ORGANIZATION как условие отбора, то по части синтетического ключа никто и никогда ничего отбирать не будет - для этого надо уж очень изощренно, преднамеренно и неудобно для самого себя действовать. С организациями у нас похоже действительно непонимание - я нигде не собирался физическое место создания привязывать к организации, тем более, что часть организаций могут пользоваться общей базой. Мне нужно просто знать какой организацией какая запись была создана. Давайте я попробую обобщить ваше предложение, посмотрим правильно ли я вас понял? 1. Раздаем каждой организации свой диапазон для получения синтетического ключа. Получаем единственный синтетический первичный ключ, который гарантировано не пересечется с другими при слиянии баз. Синтетический ключ не содержит ID организации, но косвенно, через доступный диапазон, несет информацию об организации его создавшей (т.е. по сути ничем не отличается от раздачи организациям ID_ORGANIZATION и генерации на его основе единого ключа из ID_ORGANIZATION + SEQ_NUMBER. В вашем варианте это же делает sequency с начальным значением в виде все той же ID_ORGANIZATION). 2. Также вводим во все "заинтересованные" таблицы ID_ORGANIZATION, которое уникальным не является, но позволяет облегчить нам жизнь при выборке. Дальше неясно: - В дочерних таблицах в качестве Foreign key используем синтетический ключ + ID_ORGANIZATION или только синтетический ключ? - как будет выглядить PK для дочерней таблицы? - хорошо, стало быть в вашем примере, когда скажем нужна таблица, когда менеджер из организации X ведет платежи по организации Y - писать в таблицу платежей 2-е ID_ORGANIZATION (одна для менеджера, одна для организации) ? Хотя к слиянию баз это и не относится. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
13.05.2009, 15:42
|
|||
|---|---|---|---|
|
|||
Распределенная база на много организаций слияние |
|||
|
#18+
Cane Cat Fisher, автор Почему бы не сделать так, чтобы в каждой таблице PK состоял только из двух полей : ID_ORGANIZATION и суррогатного ID_XXX ? 1. Зачем два поля в PK? Cуррогатный ID_XXX без усилий можно сделать уникальным во всей распределенной базе. 2. Как сделать всего два поля в дочерних таблицах? Рассмотрим 3-и таблицы - 2-е первичных, скажем клиенты и товары и одну дочернюю таблицу связи, содержащая сведения по тому, какие клиенты какие товары купили. Можно посмотреть как примерно будут выглядеть все эти таблицы и как будет выглядеть отбор по организации для дочерней таблицы? У меня дочерняя таблица, если мы используем предложенный вами PK из 2-х полей, выглядит несколько странно, как-то так: FK по ID_CLIENT + ID_ORGANIZATION_1. FK по ID_PRODUCT + ID_ORGANIZATION_2. PK по ID_SALARY + ID_ORGANIZATION_3?. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
13.05.2009, 16:16
|
|||
|---|---|---|---|
Распределенная база на много организаций слияние |
|||
|
#18+
carperЗапутался, давайте попробуем разобраться, если не сложно Согласен. Я сейчас попробую изложить своё видение не в форме ответов на вопросы, а как линейный текст. По статусу... я работал с такими системами в нескольких проектах, и так или иначе пробовал всё, что здесь называлось, поэтому позволю себе ссылаться на личный опыт. Мы запутались в терминологии. Давайте попробуем так. У нас есть две основных сущности: это сервер (экземпляр базы данных, instance) и филиал/организация (некая штатная единица нашей сети). Филиал/организация - в моём представлении синонимы. Я бы предложил использовать "филиал", чтобы не путать с организациями-контрагентами. Между этими двумя сущностями в принципе отношения многие-ко-многим. То есть обычно филиал сидит на своём сервере, но в принципе может быть несколько филиалов на одном сервере, и бывает так, что сотрудник одного филиала должен работать на сервере другого филиала (локально или удалённо). В первую очередь подчеркну, что я против составных ключей как основы архитектурного решения. Иногда - в конкретном месте - они удобны, но "везде" от них много геморроя и ошибок. Не дело. В данном случае, кроме того, такой подход усилит проблематику "здесь играем, здесь не играем" - усилит соблазн использовать поле для разных по сути задач. Внутри одного сервера уникальность обеспечивается механизмами сервера. Для слияния нам нужно обеспечить уникальность ключей между серверами. Минимальный геморрой здесь достигается в случае, если функция генерации использует параметром "место генерации" и гарантирует разные результаты для разных мест - так работает guid, так работает приведённый сиквенс, есть и другие варианты. Ценой этого является "неиспользование части возможных значений", и это очень дёшево . Приведённый сиквенс является с моей точки зрения лучшим во всех случаях, когда количество источников поддаётся надёжной оценке сверху (если может расти лавинообразно, лучше таки guid). "Место генерации" в ключе означает сервер, физическое место, а не логическое. Почему: потому что многие ко многим. Логическое может быть использовано тогда и только тогда, когда одному логическому не могут соответствовать разные физические - иначе есть вероятность дублирования. В этот ключ технически можно положить ID филиала и любую другую дополнительную информацию - в дополнение и именно в дополнение к ID сервера. Делать так имхо не стоит, причины этого изложены в обосновании 1НФ: с такими данными труднее работать, они плохо индексируются итп. Единственный плюс такого подхода - неявная денормализация, но это палка о двух концах. Денормализация и так вещь, требующая аккуратности... явная лучше. Таким образом, мы приходим к простой, чёткой и понятной схеме: физика закодирована в ID записи, а в таблицах - обычные поля для логики, ID филиала в частности. Собственно, в результате "транспорт" оказывается вообще не проблемой уровня архитектуры таблиц, он ниже - то есть, нам удалось правильно разложить задачу по полочкам. В дочерних таблицах первичный ключ - ровно такой же, из одного поля. На родительские таблицы - по идее, ссылка по одному полю этого ключа. Хотя, в некоторых конкретных случаях, мы можем сделать "проверку денормализации", используя внешний ключ по двум полям - где сочтём необходимым. Ну а в таблицу писать столько ID организаций, сколько это нужно с точки зрения конкретной бизнес-функции. Тут уж не должно быть каких-то искусственных ограничений. Правда, не с организациями, но у меня был случай, когда одна и та же таблица имела пять внешних ключей на другую - с разными смыслами. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
13.05.2009, 16:49
|
|||
|---|---|---|---|
|
|||
Распределенная база на много организаций слияние |
|||
|
#18+
softwarer, Спасибо. Становится яснее. Итак. 1. Синтетический первичный ключ - это привязка к инстансу - экземпляру базы. Его задача - только обеспечение уникальности в пределах всех баз. Он логически никак не привязан к организации, т.е. сами диапазоны значений такого ключа раздаются не организациям, а экземплярам баз. Плата за это - некоторое уменьшение доступных диапазонов. Этот ключ не является составным и в него не входит ID_ORGANIZATION. Так? 2. Все таблицы связываются между собой только по этому ключу (ну, за исключением особых случаев). Так? 3. Во все таблицы, которые должны иметь информацию о принадлежности к организации включаем идентификатор/ры организации. Если так, то остается вопрос - как все же лучше делать: - создавать ID_ORGANIZATION только в родительской таблице и вязать ее всегда с дочерней, если надо в этой дочерней сделать выборку по организации. - в дочернюю таблицу также включать ID_ORGANIZATION и тогда уже выборка из дочерней таблицы не будет тянуть за собой необходимость обращения к родительской? Но тогда уже напрашивается FK по двум полям (хотя бы для обеспечения целостности). ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
13.05.2009, 17:25
|
|||
|---|---|---|---|
Распределенная база на много организаций слияние |
|||
|
#18+
А почему бы не за кодировать эту информацию наприсер 12*1000000000 + последовательность.next 12 - флиал последовательность.next - собствеено последовательность ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
13.05.2009, 17:42
|
|||
|---|---|---|---|
Распределенная база на много организаций слияние |
|||
|
#18+
BC97А почему бы не за кодировать эту информацию наприсер 12*1000000000 + последовательность.next 12 - флиал последовательность.next - собствеено последовательность Приведённая мной схема это и делает, но с практической точки зрения более удобна. "Недозаложиться на количество филиалов" много труднее, чем "недозаложиться на количество записей в таблице". С ситуацией, когда именно в приведённой Вами схеме физически кончились ID для филиала - я уже сталкивался, и другим не посоветую :) Перезакладываться, конечно, можно, но тут ещё встаёт вопрос длины ID.. чем они длиннее, тем неудобнее руками ковыряться в базе. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
13.05.2009, 17:45
|
|||
|---|---|---|---|
Распределенная база на много организаций слияние |
|||
|
#18+
carper 1. Так. 2. Так. 3. Так. carperЕсли так, то остается вопрос - как все же лучше делать: - создавать ID_ORGANIZATION только в родительской таблице .... Но тогда уже напрашивается FK по двум полям (хотя бы для обеспечения целостности). А вот тут уже имхо - по ситуации. Это обычная задача денормализации, и я не стал бы принимать "одно решение на все случаи жизни". По умолчанию делаем минимум, там, где напрягает - денормализуем. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
13.05.2009, 17:49
|
|||
|---|---|---|---|
Распределенная база на много организаций слияние |
|||
|
#18+
softwarerBC97А почему бы не за кодировать эту информацию наприсер 12*1000000000 + последовательность.next 12 - флиал последовательность.next - собствеено последовательность Приведённая мной схема это и делает, но с практической точки зрения более удобна. "Недозаложиться на количество филиалов" много труднее, чем "недозаложиться на количество записей в таблице". С ситуацией, когда именно в приведённой Вами схеме физически кончились ID для филиала - я уже сталкивался, и другим не посоветую :) Перезакладываться, конечно, можно, но тут ещё встаёт вопрос длины ID.. чем они длиннее, тем неудобнее руками ковыряться в базе. думаю для самого, уникального ID number(10) хватит на долго ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
13.05.2009, 17:51
|
|||
|---|---|---|---|
Распределенная база на много организаций слияние |
|||
|
#18+
softwarercarper 1. Так. 2. Так. 3. Так. carperЕсли так, то остается вопрос - как все же лучше делать: - создавать ID_ORGANIZATION только в родительской таблице .... Но тогда уже напрашивается FK по двум полям (хотя бы для обеспечения целостности). А вот тут уже имхо - по ситуации. Это обычная задача денормализации, и я не стал бы принимать "одно решение на все случаи жизни". По умолчанию делаем минимум, там, где напрягает - денормализуем. Суть в том, что код филиала в таком случае должен быть каким то образом закодирован в ключе, не обязательно таким образом как я предложил ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
13.05.2009, 18:11
|
|||
|---|---|---|---|
|
|||
Распределенная база на много организаций слияние |
|||
|
#18+
softwarer, Спасибо еще раз, наверное так и сделаю. Бог с ним, с составным синтетическим, а то и вправду запутаюсь. BC97Суть в том, что код филиала в таком случае должен быть каким то образом закодирован в ключе, не обязательно таким образом как я предложил Вот именно эту ситуацию мы и рассматривали, пока пришли к выводу, что это не лучший выход. :) Т.е. надо таки плодить отдельное поле ID_ORGANIZATION, НЕ входящее в первичный ключ. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|

start [/forum/topic.php?fid=32&tablet=1&tid=1543258]: |
0ms |
get settings: |
7ms |
get forum list: |
17ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
66ms |
get topic data: |
14ms |
get forum data: |
2ms |
get page messages: |
60ms |
get tp. blocked users: |
1ms |
| others: | 228ms |
| total: | 403ms |

| 0 / 0 |
