Форум: "Базы";
Поиск по всему сайту: delphimaster.net;
Текущий архив: 2002.01.24;
Скачать: [xml.tar.bz2];




Вниз

GUID 


Polevi   (2001-12-17 11:36) [0]

Господа, есть ли противопоказания против ипользования GUID в качестве PK поля в MS SQL?
Мне нужно реализовывать brief-case - PK должен формироваться на клиенте



kig   (2001-12-19 21:55) [1]

Ни каких по использованию GUID...
Только вот клиенты (brief-case) с сетевыми картами ???



XPDeveloper   (2001-12-20 00:04) [2]

Есть. Так как Guid -условно уникален, да и жрет по размеру много.
Для обеспечения уникальности - он никак не подходит.
Хотя может я не понимаю задачи.



Kapusto   (2001-12-20 09:53) [3]

>XPDeveloper
Насколько я понимаю, сам MS SQL использует GUID-поля при репликации данных, так что я не понимаю, почему бы не сделать то же самое самому?

Хотя, например, можно было бы пойти и другим путем (насколько я понял постановку задачи) - делать IDENTITY поля с различным стартовым значением
(например, на клиенте начать нумерацию с 1000000). Хотя у этого способа также есть свои очевидные минусы.



Polevi   (2001-12-20 09:58) [4]

Задача классическая - клиент подключается к базе, заливает данные, отключается, в оффлайне добавляет записи, подключается и заливает данные в базу. Можно конечно каждому клиенту выдавать диапазон PK-значений ..



Slava   (2001-12-20 10:25) [5]

Вот здесь до сих пор обсуждают:
http://www.delphikingdom.com/cgi-bin/talk.cgi?ID=152



Вячеслав   (2001-12-20 10:33) [6]

>XPDeveloper Условно уникален, а условие что-то вроде времени жизни вселенной. Думаю хватит.
И не такой он большой по нынешним меркам.



Kapusto   (2001-12-20 10:53) [7]

В принципе, имхо ничто не мешает использовать GUID в качестве первичного ключа, но это только в том случае, если в основной базе далее не будут ставиться задачи типа "какие записи каким клиентом были добавлены".
Кстати, а какого типа данные будут заливаться клиентами?



kig   (2001-12-20 14:00) [8]

2XPDeveloper
На счет условной уникальности - ну это если на компе сетевой карты не
стоит - а так в алгоритме генерации используется MAC адрес карты, который
сам по себе уникален (если конечно какой нибудь левый производитель
сетевух не объявится)...
Без сетевой карты при генерации GUID уникальность гарантируется только
в пределах этого компа.

Поэтому я и спросил - сетевые карты у бриф-кайзников стоят?



Kapusto   (2001-12-20 14:09) [9]

>kig
Неправда ваша... Если бы уникальность гарантировалась только в пределах компа, то технологии СОМ уже наступил бы глобальный кирдык...
Для генерации используется текущее время в мс, и еще какие-то параметры компа... так что вероятность совпадения GUID _очень_ мала



Polevi   (2001-12-20 14:11) [10]

2kig
сетевые карты стоят - это вроде понятно из моего предыдущего ответа :)))



Delirium   (2001-12-20 14:32) [11]

Насколько, я знаю GUID можно получать по разному, тот GUID который появляется в MSSQL ( NEWID() ), как раз и является лучшим, уникальным идентификатором. И я бы рекомендовал именно такие идентификаторы и использывать в MSSQL.



kig   (2001-12-20 14:37) [12]

2Kapusto

Я же сказал, если без сетевой карты...("... и еще какие-то параметры компа")

Правда... правда не моя ))))

Из MSDN (UuidCreate)

"
In Windows NT 4.0, Windows 95, DCOM release, and Windows 98, UuidCreate returns RPC_S_UUID_LOCAL_ONLY when the originating computer does not have an ethernet/token ring (IEEE 802.x) address. In this case, the generated UUID is a valid identifier, and is guaranteed to be unique among all UUIDs generated on the computer. However, the possibility exists that another computer without an ethernet/token ring address generated the identical UUID. Therefore you should never use this UUID to identify an object that is not strictly local to your computer. Computers with ethernet/token ring addresses generate UUIDs that are guaranteed to be globally unique."

Я думаю, что добавить нечего...

2Polevi
Не понятно - сливаться можно и через модем))))
Ну если стоят карты - ну тогда ни каких препятсвий с полным отсутствием
гимора, типа диапазоны PK и т.п.)))



kig   (2001-12-20 14:53) [13]

2Delirium

Без разницы))) Все равно MSSQL в конечном счете вызывает CoCreateGUID,
который в свою очередь вызывает UuidCreate (или MSSQL его на прямую), который
в свою очередь реализует алгоритм генерации GUID (где то он на сайте OMG описан, если не ошибаюсь)

Тем более в поставленной задаче newid() как раз и не получится
использовать...



Delirium   (2001-12-20 15:45) [14]

2 kig
"Тем более в поставленной задаче newid() как раз и не получится
использовать..." - имеешь в виду, что GUID надо получать на клиенте "offline"? Тогда, конечно, остаётся CreateGUID или RPCRT4.DLL, кому как нравится :)



Anatoly Podgoretsky   (2001-12-20 21:26) [15]

Это противоречие решается просто

Уникальный идентификаторр клиента + GUID
Уникальный идентификаторр клиента выдается централизованно при инсталляции системы.



SergVlad   (2001-12-20 23:50) [16]

Наиболее правильное решение, к тому же обеспечивающее идентификацию клиента после сливания баз.




Форум: "Базы";
Поиск по всему сайту: delphimaster.net;
Текущий архив: 2002.01.24;
Скачать: [xml.tar.bz2];




Наверх





Память: 0.75 MB
Время: 0.017 c
3-75531           Kilavit               2001-12-20 22:50  2002.01.24  
Индексация


1-75557           bit                   2002-01-06 10:38  2002.01.24  
Error


6-75643           Glux                  2001-10-24 17:05  2002.01.24  
Руссский текст в Subject


1-75547           Yuraz                 2002-01-04 19:13  2002.01.24  
Не получается стереть рисунок с формы, делаю так:


3-75492           Killavit              2001-12-18 22:50  2002.01.24  
Индексация Таблиц