powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Проектирование БД [игнор отключен] [закрыт для гостей] / Выбор PK для распределенной БД
28 сообщений из 28, показаны все 2 страниц
Выбор PK для распределенной БД
    #36426607
Senya_L
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Поделитесь опытом, пожалуйста, по такому вопросу. Есть ИС, состоящая из центральной БД (Ц) и филиалов (Ф). В (Ф) в некую таблицу заносятся некие данные, которые затем переносятся в (Ц). Как лучше поступить:
1) В таблице сделать суррогатный PK в виде одного целочисленного столбца и задать всем филиалам непересекающиеся диапазоны идентификаторов
2) Сделать составной PK, состоящий из полей (ID, idBranch), т.е. включить в первичный ключ еще и внешний ключ на таблицу филиалов (Branch).

Какие "за" и "против"?
...
Рейтинг: 0 / 0
Выбор PK для распределенной БД
    #36427084
Фотография ChA
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
1. Контроль диапазонов ?
2. Оправданность idBranch в PK ?

GUID ?
...
Рейтинг: 0 / 0
Выбор PK для распределенной БД
    #36427327
Senya_L
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ChA1. Контроль диапазонов ?
2. Оправданность idBranch в PK ?

GUID ?1. Например, использовать файл-ключ, в котором идентифицируется какому филиалу принадлежит БД (это уже есть) и задается начальное значение ID.
2. Вот и самому интересно :) Мне привычнее диапазоны.
3. GUIDы? Хмм... даже не знаю. Не нравятся мне гуиды. Хотя бы из того, что у меня MSSQL, а использование гуидов приводит к фрагментации индексов (в ветке MSSQL был небольшой холиварчик, если помните, про гуиды в PK).
...
Рейтинг: 0 / 0
Выбор PK для распределенной БД
    #36427407
rsolanov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Senya_L,

Советую Вам создавать структуру БД таким образом, чтобы в ней как можно больше было тех данных которые могут быть востребованы, поясню: если Вы не будете использовать GUID (запомните, это не панацея!), а в таблице центральной БД будут такие поля, как id филиала и id кажой записи таблицы БД филиала, то это Вам позволит составлять сводную отчетность по деятельности каждого из филиалов, что на мой взгляд весьма важно и подобные отчеты начальству могут потребоваться в самое ближайшее время после начала эксплуатации этой ИС. Если у Вас например эта таблица в центральной БД, куда сливается вся инфа из филиалов является главной по отношению к другой таблице, то можете использовать составной ключ (id филиала и id записи в БД филиала). На мой взгляд, использование GUID в этом случае - это первый шаг к денормализации центральной БД.
...
Рейтинг: 0 / 0
Выбор PK для распределенной БД
    #36428033
Фотография ChA
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Senya_L1. Например, использовать файл-ключ, в котором идентифицируется какому филиалу принадлежит БД (это уже есть) и задается начальное значение ID.
2. Вот и самому интересно :) Мне привычнее диапазоны.
3. GUIDы? Хмм... даже не знаю. Не нравятся мне гуиды. Хотя бы из того, что у меня MSSQL, а использование гуидов приводит к фрагментации индексов (в ветке MSSQL был небольшой холиварчик, если помните, про гуиды в PK).1. Техническая проблема подменяется организационной. Учитывая "законы" Мерфи, предпочитаю избегать влияние человеческого фактора.
2. В филиалах idBranch явно избыточен, если же его там исключить, то вместо одной схемы БД получим минимум две, с разными видами запросами и подходами к оптимизации. Да и в центре толку от idBranch немного, разве только все запросы будут строго пофилиальные, что маловероятно. Не для этого обычно собирают данные с филиалов. С другой стороны, начиная с 2008, если правильно помню, поле idBranch в филиалах можно будет сделать виртуальным, тогда единообразие сохраниться, но от усложнения запросов на слияние по ключу никуда не денемся. В общем, не то чтобы совсем безнадёжно, но на любителя, IMHO.
3. Против чувства не попрёшь, хотя аргумент слабоват.
Во-первых не просто индексов, а кластерных индексов. Но PK вовсе не обязательно должен быть кластерным, наверняка найдутся более удачные кандидаты с учётом типовых запросов.
Во-вторых:
1. фрагментации невозможно избежать в принципе, не в кластерном, так в остальных индексах
2. влияние этой фрагментации на общую производительность может быть практически незаметным
3. с 2005 и выше есть генерация последовательных GUID
В третьих, с учётом распределённой БД почти наверняка захотите воспользоватся штатными механизмами репликаций, а они построены на использовании GUID, который всё равно придётся добавлять в таком случае, так зачем от него сразу отказываться ?

Как вариант - перегенерация ключа в центре при поступлении данных из филиалов, с сохранением в отдельной таблице(ах) информации о филиале и локальном идентификаторе. Но не уверен в оптимальности такого решения. При таком варианте схема БД практически не меняется, кроме добавления транслирующих таблиц в центре, только синхронизация слегка усложнится.

Разумеется, если рассматривать исходную задачу ровно как описано в первом топике, копирование данных из одной таблицы филиала в одну центральную таблицу, то все эти заморочки ни к чему. И 1 и 2 способ вполне удовлетворительно решат исходную задачу. Но что-то мне подсказывает, что дело этим не ограничивается, а изобретается общий подход.
...
Рейтинг: 0 / 0
Выбор PK для распределенной БД
    #36428882
Фотография Сергей Васкецов
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ChAВ филиалах idBranch явно избыточен
Как только репликация станет двунаправленной (а это возникнет не позже, чем народ поймет необходимость регламента ведения основных справочников), все придется переделывать.

ChAс учётом распределённой БД почти наверняка захотите воспользоватся штатными механизмами репликаций
Хм. У нас как раз не возникло подобного желания, Sybase RS вполне себе не хуже это умеет, но тут может быть специфика.

ChAКак вариант - перегенерация ключа в центре при поступлении данных из филиалов, с сохранением в отдельной таблице(ах) информации о филиале и локальном идентификаторе
Тогда уж можно просто сливать из Ф в Ц данные в разные БД, а на Ц-ом сервере просто иметь информацию, какой Ф какой БД соответствует. Безо всяких проблем с идентификаторами.
...
Рейтинг: 0 / 0
Выбор PK для распределенной БД
    #36429146
САП_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Senya_L
1) ... непересекающиеся диапазоны идентификаторов
2) ... состоящий из полей (ID, idBranch),
это одно и то же. id делит множество значений (ID)x(idBranch) на (ID) диапазонов, каждый по (idBranch) значений. скобками я обозначил мощность множества значений, задаваемое типом столбца: int - 2(4) миллиарда, big int - чуть более
...
Рейтинг: 0 / 0
Выбор PK для распределенной БД
    #36429738
Senya_L
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ChA, благодарю за ответы. Отвечу по некоторым замечаниям.
ChA1. Техническая проблема подменяется организационной. Учитывая "законы" Мерфи, предпочитаю избегать влияние человеческого фактора.Хмм... не совсем согласен. Задача идентификации экземпляра БД в любом случае возникнет. И в любом случаем некий сертификат должен использоваться для установки. Хотя бы потому, что предполагается использовать шифрование.
ChAРазумеется, если рассматривать исходную задачу ровно как описано в первом топике, копирование данных из одной таблицы филиала в одну центральную таблицу, то все эти заморочки ни к чему. И 1 и 2 способ вполне удовлетворительно решат исходную задачу. Но что-то мне подсказывает, что дело этим не ограничивается, а изобретается общий подход.Да никакого "общего подхода" не предполагается. Архитектура системы проста до безобразия. Есть НСИ, которая ведется в Ц и которая реплицируется в сторону Ф. В Ф заносят данные, которые в свою очередь реплицируются в сторону Ц. В силу относительной простоты ИС и требования off-line репликации (не везде есть каналы связи) достаточно ограничиться либо средствами ETL или банальным bcp. Там табличек не более 10 наберется. В Ц предполагается создать проекцию данных со всех Ф. Эти данные потом сливаем в базу аналитики. Как-то так.

Единственная разница между составным и несоставным PK мне видится в размере FK. Влияние на скорость это вряд ли окажет, так что непринципиально. Разве что случай слияния Ф-ов, тогда имхо использование диапазонов окажется более удобным и гибким подходом.

ChA, кстати, насчет штатной репликации. Не силен в репликации MSSQL, но для MERGE-репликации есть штатное назначение диапазонов подписчикам. Нафига тогда ROWGUIDCOL? Не совсем понятно, хотя... в этой ветке это скорее оффтоп. :)
...
Рейтинг: 0 / 0
Выбор PK для распределенной БД
    #36430420
Фотография ChA
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Senya_LChA1. Техническая проблема подменяется организационной.Задача идентификации экземпляра БД в любом случае возникнет. И в любом случаем некий сертификат должен использоваться для установки. Хотя бы потому, что предполагается использовать шифрование.Количество филиалов заранее неизвестно, соответственно, границы тоже. Делать диапазоны малыми на один филиал, может понадобиться несколько разных диапазонов на один филиал. При делении поровну имеем хлопоты с появлением новых филиалов. Какие-никакие, а всё-таки проблемы. Можно, конечно, выделять диапазоны гарантировано охватывающие количество возможных записей на филиал, но возможна неверная оценка. Кроме того, чисто теоретически филиалы могут не только появляться, но делиться, сливаться и исчезать. Но это только часть проблемы.
Главное, что "кто-то кое-где" должен следить за этими дипазонами. Кроме того, на местах никакие администраторы не должны проявлять самодеятельности и "следить", чтобы оставаться в рамках диапазона. В то же время, работа не должна остановиться, если дипазон внезапно закончится. В общем, надёжность такого решения лично мне кажется сомнительной. Слишком "силён" человеческий фактор.Senya_LЕдинственная разница между составным и несоставным PK мне видится в размере FK. Влияние на скорость это вряд ли окажет, так что непринципиально. Разве что случай слияния Ф-ов, тогда имхо использование диапазонов окажется более удобным и гибким подходом.В случае составного ключа производительность MS SQL принципиально не упадёт, но программистов запросто - запросы на слияние по идентификаторам усложнятся, надо будет всё время помнить о том, что слияние идёт по составному ключу. С точки зрения физической оптимизации, составной ключ, как и любой составной индекс, полезны, если в типовых запросах есть необходимость фильтрации(иногда группировки) по большинству этих полей, что обычно приводит к снижению IO. В противном случае, применение неоправдано и ведёт только к снижению его эффективности, увеличению индекса и усложнению запросов.

Сергей ВаскецовТогда уж можно просто сливать из Ф в Ц данные в разные БД, а на Ц-ом сервере просто иметь информацию, какой Ф какой БД соответствует. Безо всяких проблем с идентификаторами.С неменьшим успехом можно и в одну БД, но в разные таблицы, соответствующие филиалам. Но при любом из этих подходов будет несколько сложнее писать агрегирующие запросы, будут сплошные UNION. Да и оптимизатору будет явно сложнее найти эффективный планы выполнения подобных запросов. Не говоря уж о том, что придется хранить, верифицировать и активно использовать некую метаинформации о том, какие БД(таблицы) должны включаться в запрос, а какие нет. Иначе, можем запросто получить ошибку при выполнения запроса, так как БД(таблицу) удалили за ненадобностью(удалением филиала). Т.е., "нос вытащил - хвост увяз".
...
Рейтинг: 0 / 0
Выбор PK для распределенной БД
    #36432436
mcureenab
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Пожалуй GUID самый простой и надёжный способ генерации сурогатных ключей. В оракле GUID используется для идентификации объектов пользовательского типа в том числе и в распределённых, реплицируемых БД.

Раз уж оракл пользует GUID, то что нам смертным не пользоваться тем же?
...
Рейтинг: 0 / 0
Выбор PK для распределенной БД
    #36432453
Фотография BULK INSERT
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Senya_LКакие "за" и "против"?

тысячу раз уже дискутировалась тема - неужели сложно поискать?
...
Рейтинг: 0 / 0
Выбор PK для распределенной БД
    #36432473
egorych
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mcureenabПожалуй GUID самый простой и надёжный способ генерации сурогатных ключей.единственный минус, что этот самый простой и надёжный способ генерации никак не поможет идентифицировать, от какого именно филиала пришла конкретная запись.
...
Рейтинг: 0 / 0
Выбор PK для распределенной БД
    #36433298
mcureenab
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
egorychmcureenabПожалуй GUID самый простой и надёжный способ генерации сурогатных ключей.единственный минус, что этот самый простой и надёжный способ генерации никак не поможет идентифицировать, от какого именно филиала пришла конкретная запись.

Так же можно посетовать, что GUID не содержит вообще всех данных записи, а заодно и оклад начальника (одно время ходил слух, что в GUID входит остаток счёта Билла Гейтса).

Не следует навешивать на информационный элемент более одной функции. Для идентификации филиала можно и нужно использвать соответствующие атрибуты записи, а не мешать их в ID записи.
...
Рейтинг: 0 / 0
Выбор PK для распределенной БД
    #36433342
egorych
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mcureenab,
вы меня не поняли. Я к тому, что использование GUID в данном контексте ничем, принципиально, не отличается от использования INT( или BIGINT, или другого типа данных ). Всё равно, требуется связка id филиала + id записи, использовать GUID или другой тип данных для id записи - вопрос религиозный, и мало интересный.
...
Рейтинг: 0 / 0
Выбор PK для распределенной БД
    #36433668
mcureenab
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
egorych,

GUID в данном случае не только тип, но и алгоритм генерации значений, который обеспечиает их глобальную уникальность, что и требуется. Слово INT или BIGINT ничего не говорит о генерации ключей.

А вот связка ID записи с филиалом, как раз не требуется. Это издержки одного из вариантов решения. Т.е. внутрисистемный атрибут (сурогатный ID записи) зависит от прикладной области (разбивка на филиалы). Представьте, что будет в системе с многоуровневым иерархическим делением организации (местные филиалы сливают данные в окружные, а окружные в штаб квартиру)?
...
Рейтинг: 0 / 0
Выбор PK для распределенной БД
    #36433771
egorych
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mcureenabА вот связка ID записи с филиалом, как раз не требуется. , если нет необходимости в запросах по каждому из филиалов в отдельности в центральной базе, иначе, с одним только GUID, от неё никуда не деться. Под id в данном случае, я понимаю не обязательно только суррогатный ключ. Способ идентификации конкретного автора записи может быть любым, но он должен быть, вот что важно.
...
Рейтинг: 0 / 0
Выбор PK для распределенной БД
    #36433809
mcureenab
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
egorych,

на счёт идентификации автора ты сам придумал. В постановке задачи этого нет. Как раз напротив, могут быть ситуации, когда идентификация автора должна быть невозможной. Например в системе тайного голосования.
В своё время алгоритм GUID от Microsoft критиковали за то, что их GUID содержал MAC адрес, что потенциально позволяло вычислить автора GUID.
...
Рейтинг: 0 / 0
Выбор PK для распределенной БД
    #36433823
Фотография Сергей Васкецов
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mcureenabНапример в системе тайного голосования
Сайт голосователя и сам голосователь - разные вещи.
...
Рейтинг: 0 / 0
Выбор PK для распределенной БД
    #36433877
mcureenab
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Сергей Васкецов,

вы выдумали неудачный пример. Если говорить о задаче с филиалами, то можно потребовать, что после сбора данных от окружных избирательных комиссий в центральной БД невозможно будет идентифицировать не только избирателя, но и его округ (филиал).
...
Рейтинг: 0 / 0
Выбор PK для распределенной БД
    #36433921
Фотография Сергей Васкецов
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mcureenabвы выдумали неудачный пример
КМК, как раз обоснование необходимости анонимности как раз неудачное.
Анонимность - это требование невозможность идентифицировать субъекта-автора, а не пожелание невозможности идентфицировать источник данных, которое легко реализуется при обработке данных.
...
Рейтинг: 0 / 0
Выбор PK для распределенной БД
    #36433954
egorych
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mcureenab wrote:
>> egorych, на счёт идентификации автора ты сам придумал. В постановке задачи этого нет.
не читатель?
Senya_L ( топик-стартер, если что )1. Например, использовать файл-ключ, в котором идентифицируется какому филиалу принадлежит БД (это уже есть) и задается начальное значение ID.
и далее:Senya_L ( топик-стартер, если что )Задача идентификации экземпляра БД в любом случае возникнет.

mcureenabКак раз напротив, могут быть ситуации, когда идентификация автора должна быть невозможной. Например в системе тайного голосования.
В своё время алгоритм GUID от Microsoft критиковали за то, что их GUID содержал MAC адрес, что потенциально позволяло вычислить автора GUID.а вот это уже чистой воды творчество, только не моё. Вот этого как раз в постановке не было.
...
Рейтинг: 0 / 0
Выбор PK для распределенной БД
    #36433973
mcureenab
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Сергей Васкецов,

обрабатывать данные можно поразному. Если данные есть, то есть и вероятность, что они будут обработаны не так как вы хотели. Если данных нет, то и проблема конфидециальности отпадает.

Источник данных и автор могут быть легко сопоставимы. Положим, сотрудники небольшого филиала проголосовали "неправильно" - не как большинство. Новое руководство рассматривает результаты головования, "вычисляет" оппозиционный филиал и закрывает его.
...
Рейтинг: 0 / 0
Выбор PK для распределенной БД
    #36434025
Фотография Сергей Васкецов
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mcureenabЕсли данные есть, то есть и вероятность, что они будут обработаны не так как вы хотели. Если данных нет, то и проблема конфидециальности отпадает.
Я по опыту скорее поверю, что данных нет, потому что кто-то решил, что они не нужны, а потом волосы из-за этого рвут на разных филейных частях тела. Если существующие данные надо скрыть, это решается не их удалением, а правами доступа.
...
Рейтинг: 0 / 0
Выбор PK для распределенной БД
    #36434296
mcureenab
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Сергей Васкецов,

это не всегда возможно. Как например скрыть № филиала, если он входит в ID записи? Не зная ID приложения БД просто не будут работать. Вывод - филиал не может присутствовать в ID записи, если мы хотим ограничить доступ к этим данным.

У меня на работе данные VIP клиентов из соображений безопасности не вносятся в общую БД. И это правильно. Не применять же усиленные меры безопасности ко всем клиентам, из-за нескольких VIP'ов. Это как минимум будет мешать повседневной работе.
...
Рейтинг: 0 / 0
Выбор PK для распределенной БД
    #36434318
Фотография Сергей Васкецов
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mcureenabфилиал не может присутствовать в ID записи, если мы хотим ограничить доступ к этим данным
безо всяких "если" не может. просто в случае диапазонов последовательностей это побочное явление, на котором пытаются сыграть, что концептуально неверно. надо филиал - делай поле.

mcureenabоффтопик насчет випов
Это как минимум сомнительно и недальновидно.
...
Рейтинг: 0 / 0
Выбор PK для распределенной БД
    #36434403
Фотография iscrafm
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
egorychmcureenab wrote:
>> egorych, на счёт идентификации автора ты сам придумал. В постановке задачи этого нет.
не читатель?
Senya_L ( топик-стартер, если что )1. Например, использовать файл-ключ, в котором идентифицируется какому филиалу принадлежит БД (это уже есть) и задается начальное значение ID.
и далее:Senya_L ( топик-стартер, если что )Задача идентификации экземпляра БД в любом случае возникнет.


речь идет о том, что задача идентификации обязательно возникнет в результате танцев с бубнами, типа сделать ID целочисленныи и каждому корреспонденту выдавать какие-то диапазоны. Мы ведь простых путей (GUID) не ищем?
...
Рейтинг: 0 / 0
Выбор PK для распределенной БД
    #36434476
egorych
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
iscrafm,
да пожалуй, что нет, не об этом. В цитируемом речь идёт о том, что задача идентифицируемости филиала _уже_ стоит, и один только GUID эту задачу не решит.
Религиозную войну на тему GUID/неGUID разводить не собирался, и без меня в ней хватает бойцов ))
ЗЫ Если что, метод решения задачи ТС через введение спец диапазонов считаю, мягко говоря, недальновидным, практически гарантирующем танцы с бубнами и проклятиями в адрес разработчика такого решения.
...
Рейтинг: 0 / 0
Выбор PK для распределенной БД
    #36434632
Фотография iscrafm
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
egorychiscrafm,
Религиозную войну на тему GUID/неGUID разводить не собирался, и без меня в ней хватает бойцов ))

Бог им в помощь, пусть воюют. Лишь бы пульки желатиновые были.

по существу вопроса ТС...
нужно выделять две задачи:
1. идентификация записи как обезличенного объекта и контроль ее уникальности в Ц. Т.е. должен быть однозначный ответ на вопрос, есть эта запись в базе уже или нет.
2. Идентификация записи как "прикладной сущности".
По п1 - GUID, если не нужны танцы
По п2 - что угодно. Если нужно определять чья запись, то в самой записи предусмотреть поля для кода филиала, имени пользователя и всего, что придет в голову. Но к вопросу о PK это уже не относится
...
Рейтинг: 0 / 0
28 сообщений из 28, показаны все 2 страниц
Форумы / Проектирование БД [игнор отключен] [закрыт для гостей] / Выбор PK для распределенной БД
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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