|
|
|
Обеспечение уникальности PK в распределенной БД
|
|||
|---|---|---|---|
|
#18+
Исходная ситуация : 1. Есть распределенная БД. Связь между отдельными БД поддерживается по е-мейлу, дискетами (пересылка пачек данных самодельным репликатором) 2. Данные из отдельных БД должны без коллизий, обусловленных одинаковыми PK, сливаться в любую из этих автономных БД. 3. Во всех случаях используется Windows-платформа. Требуется обеспечить уникальность PK записей в масштабе всей распределенной БД. Известные решения : 1. Разнесение диапазонов идентификаторов записей путем индивидуальной инициализации генераторов для каждой автономной БД. 2. Привлечение особого (уникального для каждой БД) числового "кода БД", который также "оседает" в PK. Недостатки этих решений : 1. в жестком варианте (пока администратор не даст добро задача не будет работать) тратится много времени на ожидание действий админа, доставку регистрационного ключа и появляется дополнительная "головная боль" с централизованным учетом диапазонов/кодов 2. в мягком варианте (когда пользователи сами могут взять и применить настройки из разрешенных диапазонов) возникают другие проблемы : - разные подразделения "выезжают" за пределы разрешенных для использования диапазонов и соответственно могут пересечься. - используют более одной автономной базы под одним "кодом БД" - поработав в базе под "кодом"=Х отправляют из нее данные в другие базы, после чего базу убивают, восстанавливают из архива чистую базу и присваивают ей опять "код БД"=Х Поэтому к первоначальной фомулировке задачи я добавлю автоматически поддерживаемая уникальность PK (т.е. без какого-либо участия человека в настройке системы) Подумав, я заключил, что достаточным основанием для уникальности служит тезис о невозможности работы одного и того же оборудования в разных местах (подразделениях/компьютерах) в одно и то же время. Значит привязку нужно делать к железу и времени. Время : select current_timestamp from rdb$database Железо : VolumeSerialNo из API-шной GetVolumeInformation Обе эти величины представимы в виде 4-байтового числа, а значит, в состав PK таблиц требуется ввести 2 дополнительные колонки integer. Дальше уже дело техники и триггеров на вставку... Есть ли еще не такие "корявые" решения как у меня? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.08.2003, 11:11 |
|
||
|
Обеспечение уникальности PK в распределенной БД
|
|||
|---|---|---|---|
|
#18+
Сделать первиный ключ в виде GUID - а и пуст Бил Гейтс заботится об уникальности ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.08.2003, 11:14 |
|
||
|
Обеспечение уникальности PK в распределенной БД
|
|||
|---|---|---|---|
|
#18+
От привязки ко времени создании записи нельзя отказываться и при использовании GUID. Навскидку приведу 2 ситуации : 1. Компьютер работал под задачей в одном подразделении, после чего его целиком передали в другое подразделение и скопировали на него другую автономную базу. 2. поработав в базе пользователь отправляет из нее данные в другие базы, после чего базу убивает, восстанавливает из архива чистую БД и продолжает работать в ней. В обоих случаях получается, что файлы БД эксплуатировались разные, а GUID один и тот же. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.08.2003, 11:28 |
|
||
|
Обеспечение уникальности PK в распределенной БД
|
|||
|---|---|---|---|
|
#18+
может я что не понимаю, но GUID генерируется в зависимости от времени... он генерируется УНИКАЛЬНЫМ ДЛЯ ЛЮБОГО КОМПА, В ЛЮБОЙ МОМЕНТ ВРЕМЯНИ. По крайней мере по утверждению Microsoft... Равно как на нем базируются гораздо более сложные технологии типа COM.... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.08.2003, 11:31 |
|
||
|
Обеспечение уникальности PK в распределенной БД
|
|||
|---|---|---|---|
|
#18+
А какой функцией он генерится? И разве он не будет больше 8 байтов? Естесственно, чем больше, тем хуже для производительности IB. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.08.2003, 11:37 |
|
||
|
Обеспечение уникальности PK в распределенной БД
|
|||
|---|---|---|---|
|
#18+
по мойму он и занимает 8 байт (на скорость не должно влиять) генерится функцией CoCreateGuid ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.08.2003, 11:46 |
|
||
|
|

start [/forum/topic.php?fid=40&fpage=509&tid=1580129]: |
0ms |
get settings: |
7ms |
get forum list: |
18ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
60ms |
get topic data: |
13ms |
get forum data: |
3ms |
get page messages: |
71ms |
get tp. blocked users: |
2ms |
| others: | 202ms |
| total: | 382ms |

| 0 / 0 |
