|
|
|
Выбор PK для распределенной БД
|
|||
|---|---|---|---|
|
#18+
Поделитесь опытом, пожалуйста, по такому вопросу. Есть ИС, состоящая из центральной БД (Ц) и филиалов (Ф). В (Ф) в некую таблицу заносятся некие данные, которые затем переносятся в (Ц). Как лучше поступить: 1) В таблице сделать суррогатный PK в виде одного целочисленного столбца и задать всем филиалам непересекающиеся диапазоны идентификаторов 2) Сделать составной PK, состоящий из полей (ID, idBranch), т.е. включить в первичный ключ еще и внешний ключ на таблицу филиалов (Branch). Какие "за" и "против"? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.01.2010, 13:53 |
|
||
|
Выбор PK для распределенной БД
|
|||
|---|---|---|---|
|
#18+
1. Контроль диапазонов ? 2. Оправданность idBranch в PK ? GUID ? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.01.2010, 23:59 |
|
||
|
Выбор PK для распределенной БД
|
|||
|---|---|---|---|
|
#18+
ChA1. Контроль диапазонов ? 2. Оправданность idBranch в PK ? GUID ?1. Например, использовать файл-ключ, в котором идентифицируется какому филиалу принадлежит БД (это уже есть) и задается начальное значение ID. 2. Вот и самому интересно :) Мне привычнее диапазоны. 3. GUIDы? Хмм... даже не знаю. Не нравятся мне гуиды. Хотя бы из того, что у меня MSSQL, а использование гуидов приводит к фрагментации индексов (в ветке MSSQL был небольшой холиварчик, если помните, про гуиды в PK). ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.01.2010, 12:19 |
|
||
|
Выбор PK для распределенной БД
|
|||
|---|---|---|---|
|
#18+
Senya_L, Советую Вам создавать структуру БД таким образом, чтобы в ней как можно больше было тех данных которые могут быть востребованы, поясню: если Вы не будете использовать GUID (запомните, это не панацея!), а в таблице центральной БД будут такие поля, как id филиала и id кажой записи таблицы БД филиала, то это Вам позволит составлять сводную отчетность по деятельности каждого из филиалов, что на мой взгляд весьма важно и подобные отчеты начальству могут потребоваться в самое ближайшее время после начала эксплуатации этой ИС. Если у Вас например эта таблица в центральной БД, куда сливается вся инфа из филиалов является главной по отношению к другой таблице, то можете использовать составной ключ (id филиала и id записи в БД филиала). На мой взгляд, использование GUID в этом случае - это первый шаг к денормализации центральной БД. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.01.2010, 13:53 |
|
||
|
Выбор PK для распределенной БД
|
|||
|---|---|---|---|
|
#18+
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 способ вполне удовлетворительно решат исходную задачу. Но что-то мне подсказывает, что дело этим не ограничивается, а изобретается общий подход. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.01.2010, 01:58 |
|
||
|
Выбор PK для распределенной БД
|
|||
|---|---|---|---|
|
#18+
ChAВ филиалах idBranch явно избыточен Как только репликация станет двунаправленной (а это возникнет не позже, чем народ поймет необходимость регламента ведения основных справочников), все придется переделывать. ChAс учётом распределённой БД почти наверняка захотите воспользоватся штатными механизмами репликаций Хм. У нас как раз не возникло подобного желания, Sybase RS вполне себе не хуже это умеет, но тут может быть специфика. ChAКак вариант - перегенерация ключа в центре при поступлении данных из филиалов, с сохранением в отдельной таблице(ах) информации о филиале и локальном идентификаторе Тогда уж можно просто сливать из Ф в Ц данные в разные БД, а на Ц-ом сервере просто иметь информацию, какой Ф какой БД соответствует. Безо всяких проблем с идентификаторами. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.01.2010, 13:22 |
|
||
|
Выбор PK для распределенной БД
|
|||
|---|---|---|---|
|
#18+
Senya_L 1) ... непересекающиеся диапазоны идентификаторов 2) ... состоящий из полей (ID, idBranch), это одно и то же. id делит множество значений (ID)x(idBranch) на (ID) диапазонов, каждый по (idBranch) значений. скобками я обозначил мощность множества значений, задаваемое типом столбца: int - 2(4) миллиарда, big int - чуть более ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.01.2010, 14:27 |
|
||
|
Выбор PK для распределенной БД
|
|||
|---|---|---|---|
|
#18+
ChA, благодарю за ответы. Отвечу по некоторым замечаниям. ChA1. Техническая проблема подменяется организационной. Учитывая "законы" Мерфи, предпочитаю избегать влияние человеческого фактора.Хмм... не совсем согласен. Задача идентификации экземпляра БД в любом случае возникнет. И в любом случаем некий сертификат должен использоваться для установки. Хотя бы потому, что предполагается использовать шифрование. ChAРазумеется, если рассматривать исходную задачу ровно как описано в первом топике, копирование данных из одной таблицы филиала в одну центральную таблицу, то все эти заморочки ни к чему. И 1 и 2 способ вполне удовлетворительно решат исходную задачу. Но что-то мне подсказывает, что дело этим не ограничивается, а изобретается общий подход.Да никакого "общего подхода" не предполагается. Архитектура системы проста до безобразия. Есть НСИ, которая ведется в Ц и которая реплицируется в сторону Ф. В Ф заносят данные, которые в свою очередь реплицируются в сторону Ц. В силу относительной простоты ИС и требования off-line репликации (не везде есть каналы связи) достаточно ограничиться либо средствами ETL или банальным bcp. Там табличек не более 10 наберется. В Ц предполагается создать проекцию данных со всех Ф. Эти данные потом сливаем в базу аналитики. Как-то так. Единственная разница между составным и несоставным PK мне видится в размере FK. Влияние на скорость это вряд ли окажет, так что непринципиально. Разве что случай слияния Ф-ов, тогда имхо использование диапазонов окажется более удобным и гибким подходом. ChA, кстати, насчет штатной репликации. Не силен в репликации MSSQL, но для MERGE-репликации есть штатное назначение диапазонов подписчикам. Нафига тогда ROWGUIDCOL? Не совсем понятно, хотя... в этой ветке это скорее оффтоп. :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.01.2010, 17:25 |
|
||
|
Выбор PK для распределенной БД
|
|||
|---|---|---|---|
|
#18+
Senya_LChA1. Техническая проблема подменяется организационной.Задача идентификации экземпляра БД в любом случае возникнет. И в любом случаем некий сертификат должен использоваться для установки. Хотя бы потому, что предполагается использовать шифрование.Количество филиалов заранее неизвестно, соответственно, границы тоже. Делать диапазоны малыми на один филиал, может понадобиться несколько разных диапазонов на один филиал. При делении поровну имеем хлопоты с появлением новых филиалов. Какие-никакие, а всё-таки проблемы. Можно, конечно, выделять диапазоны гарантировано охватывающие количество возможных записей на филиал, но возможна неверная оценка. Кроме того, чисто теоретически филиалы могут не только появляться, но делиться, сливаться и исчезать. Но это только часть проблемы. Главное, что "кто-то кое-где" должен следить за этими дипазонами. Кроме того, на местах никакие администраторы не должны проявлять самодеятельности и "следить", чтобы оставаться в рамках диапазона. В то же время, работа не должна остановиться, если дипазон внезапно закончится. В общем, надёжность такого решения лично мне кажется сомнительной. Слишком "силён" человеческий фактор.Senya_LЕдинственная разница между составным и несоставным PK мне видится в размере FK. Влияние на скорость это вряд ли окажет, так что непринципиально. Разве что случай слияния Ф-ов, тогда имхо использование диапазонов окажется более удобным и гибким подходом.В случае составного ключа производительность MS SQL принципиально не упадёт, но программистов запросто - запросы на слияние по идентификаторам усложнятся, надо будет всё время помнить о том, что слияние идёт по составному ключу. С точки зрения физической оптимизации, составной ключ, как и любой составной индекс, полезны, если в типовых запросах есть необходимость фильтрации(иногда группировки) по большинству этих полей, что обычно приводит к снижению IO. В противном случае, применение неоправдано и ведёт только к снижению его эффективности, увеличению индекса и усложнению запросов. Сергей ВаскецовТогда уж можно просто сливать из Ф в Ц данные в разные БД, а на Ц-ом сервере просто иметь информацию, какой Ф какой БД соответствует. Безо всяких проблем с идентификаторами.С неменьшим успехом можно и в одну БД, но в разные таблицы, соответствующие филиалам. Но при любом из этих подходов будет несколько сложнее писать агрегирующие запросы, будут сплошные UNION. Да и оптимизатору будет явно сложнее найти эффективный планы выполнения подобных запросов. Не говоря уж о том, что придется хранить, верифицировать и активно использовать некую метаинформации о том, какие БД(таблицы) должны включаться в запрос, а какие нет. Иначе, можем запросто получить ошибку при выполнения запроса, так как БД(таблицу) удалили за ненадобностью(удалением филиала). Т.е., "нос вытащил - хвост увяз". ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.01.2010, 02:33 |
|
||
|
Выбор PK для распределенной БД
|
|||
|---|---|---|---|
|
#18+
Пожалуй GUID самый простой и надёжный способ генерации сурогатных ключей. В оракле GUID используется для идентификации объектов пользовательского типа в том числе и в распределённых, реплицируемых БД. Раз уж оракл пользует GUID, то что нам смертным не пользоваться тем же? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.01.2010, 22:08 |
|
||
|
Выбор PK для распределенной БД
|
|||
|---|---|---|---|
|
#18+
Senya_LКакие "за" и "против"? тысячу раз уже дискутировалась тема - неужели сложно поискать? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.01.2010, 22:22 |
|
||
|
Выбор PK для распределенной БД
|
|||
|---|---|---|---|
|
#18+
mcureenabПожалуй GUID самый простой и надёжный способ генерации сурогатных ключей.единственный минус, что этот самый простой и надёжный способ генерации никак не поможет идентифицировать, от какого именно филиала пришла конкретная запись. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.01.2010, 22:48 |
|
||
|
Выбор PK для распределенной БД
|
|||
|---|---|---|---|
|
#18+
egorychmcureenabПожалуй GUID самый простой и надёжный способ генерации сурогатных ключей.единственный минус, что этот самый простой и надёжный способ генерации никак не поможет идентифицировать, от какого именно филиала пришла конкретная запись. Так же можно посетовать, что GUID не содержит вообще всех данных записи, а заодно и оклад начальника (одно время ходил слух, что в GUID входит остаток счёта Билла Гейтса). Не следует навешивать на информационный элемент более одной функции. Для идентификации филиала можно и нужно использвать соответствующие атрибуты записи, а не мешать их в ID записи. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.01.2010, 12:22 |
|
||
|
Выбор PK для распределенной БД
|
|||
|---|---|---|---|
|
#18+
mcureenab, вы меня не поняли. Я к тому, что использование GUID в данном контексте ничем, принципиально, не отличается от использования INT( или BIGINT, или другого типа данных ). Всё равно, требуется связка id филиала + id записи, использовать GUID или другой тип данных для id записи - вопрос религиозный, и мало интересный. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.01.2010, 12:38 |
|
||
|
Выбор PK для распределенной БД
|
|||
|---|---|---|---|
|
#18+
egorych, GUID в данном случае не только тип, но и алгоритм генерации значений, который обеспечиает их глобальную уникальность, что и требуется. Слово INT или BIGINT ничего не говорит о генерации ключей. А вот связка ID записи с филиалом, как раз не требуется. Это издержки одного из вариантов решения. Т.е. внутрисистемный атрибут (сурогатный ID записи) зависит от прикладной области (разбивка на филиалы). Представьте, что будет в системе с многоуровневым иерархическим делением организации (местные филиалы сливают данные в окружные, а окружные в штаб квартиру)? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.01.2010, 14:09 |
|
||
|
Выбор PK для распределенной БД
|
|||
|---|---|---|---|
|
#18+
mcureenabА вот связка ID записи с филиалом, как раз не требуется. , если нет необходимости в запросах по каждому из филиалов в отдельности в центральной базе, иначе, с одним только GUID, от неё никуда не деться. Под id в данном случае, я понимаю не обязательно только суррогатный ключ. Способ идентификации конкретного автора записи может быть любым, но он должен быть, вот что важно. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.01.2010, 14:43 |
|
||
|
Выбор PK для распределенной БД
|
|||
|---|---|---|---|
|
#18+
egorych, на счёт идентификации автора ты сам придумал. В постановке задачи этого нет. Как раз напротив, могут быть ситуации, когда идентификация автора должна быть невозможной. Например в системе тайного голосования. В своё время алгоритм GUID от Microsoft критиковали за то, что их GUID содержал MAC адрес, что потенциально позволяло вычислить автора GUID. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.01.2010, 14:55 |
|
||
|
Выбор PK для распределенной БД
|
|||
|---|---|---|---|
|
#18+
mcureenabНапример в системе тайного голосования Сайт голосователя и сам голосователь - разные вещи. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.01.2010, 14:57 |
|
||
|
Выбор PK для распределенной БД
|
|||
|---|---|---|---|
|
#18+
Сергей Васкецов, вы выдумали неудачный пример. Если говорить о задаче с филиалами, то можно потребовать, что после сбора данных от окружных избирательных комиссий в центральной БД невозможно будет идентифицировать не только избирателя, но и его округ (филиал). ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.01.2010, 15:13 |
|
||
|
Выбор PK для распределенной БД
|
|||
|---|---|---|---|
|
#18+
mcureenabвы выдумали неудачный пример КМК, как раз обоснование необходимости анонимности как раз неудачное. Анонимность - это требование невозможность идентифицировать субъекта-автора, а не пожелание невозможности идентфицировать источник данных, которое легко реализуется при обработке данных. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.01.2010, 15:26 |
|
||
|
Выбор PK для распределенной БД
|
|||
|---|---|---|---|
|
#18+
mcureenab wrote: >> egorych, на счёт идентификации автора ты сам придумал. В постановке задачи этого нет. не читатель? Senya_L ( топик-стартер, если что )1. Например, использовать файл-ключ, в котором идентифицируется какому филиалу принадлежит БД (это уже есть) и задается начальное значение ID. и далее:Senya_L ( топик-стартер, если что )Задача идентификации экземпляра БД в любом случае возникнет. mcureenabКак раз напротив, могут быть ситуации, когда идентификация автора должна быть невозможной. Например в системе тайного голосования. В своё время алгоритм GUID от Microsoft критиковали за то, что их GUID содержал MAC адрес, что потенциально позволяло вычислить автора GUID.а вот это уже чистой воды творчество, только не моё. Вот этого как раз в постановке не было. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.01.2010, 15:34 |
|
||
|
Выбор PK для распределенной БД
|
|||
|---|---|---|---|
|
#18+
Сергей Васкецов, обрабатывать данные можно поразному. Если данные есть, то есть и вероятность, что они будут обработаны не так как вы хотели. Если данных нет, то и проблема конфидециальности отпадает. Источник данных и автор могут быть легко сопоставимы. Положим, сотрудники небольшого филиала проголосовали "неправильно" - не как большинство. Новое руководство рассматривает результаты головования, "вычисляет" оппозиционный филиал и закрывает его. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.01.2010, 15:38 |
|
||
|
Выбор PK для распределенной БД
|
|||
|---|---|---|---|
|
#18+
mcureenabЕсли данные есть, то есть и вероятность, что они будут обработаны не так как вы хотели. Если данных нет, то и проблема конфидециальности отпадает. Я по опыту скорее поверю, что данных нет, потому что кто-то решил, что они не нужны, а потом волосы из-за этого рвут на разных филейных частях тела. Если существующие данные надо скрыть, это решается не их удалением, а правами доступа. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.01.2010, 15:52 |
|
||
|
Выбор PK для распределенной БД
|
|||
|---|---|---|---|
|
#18+
Сергей Васкецов, это не всегда возможно. Как например скрыть № филиала, если он входит в ID записи? Не зная ID приложения БД просто не будут работать. Вывод - филиал не может присутствовать в ID записи, если мы хотим ограничить доступ к этим данным. У меня на работе данные VIP клиентов из соображений безопасности не вносятся в общую БД. И это правильно. Не применять же усиленные меры безопасности ко всем клиентам, из-за нескольких VIP'ов. Это как минимум будет мешать повседневной работе. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.01.2010, 17:12 |
|
||
|
Выбор PK для распределенной БД
|
|||
|---|---|---|---|
|
#18+
mcureenabфилиал не может присутствовать в ID записи, если мы хотим ограничить доступ к этим данным безо всяких "если" не может. просто в случае диапазонов последовательностей это побочное явление, на котором пытаются сыграть, что концептуально неверно. надо филиал - делай поле. mcureenabоффтопик насчет випов Это как минимум сомнительно и недальновидно. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.01.2010, 17:18 |
|
||
|
|

start [/forum/topic.php?fid=32&msg=36434296&tid=1542874]: |
0ms |
get settings: |
7ms |
get forum list: |
14ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
156ms |
get topic data: |
9ms |
get forum data: |
2ms |
get page messages: |
77ms |
get tp. blocked users: |
2ms |
| others: | 211ms |
| total: | 484ms |

| 0 / 0 |
