|
|
|
генерация primary key до вставки
|
|||
|---|---|---|---|
|
#18+
(powerBuilder 9.01 + msSqlServer 2000) У нас на фирме написана библиотека, аналогичная PFC.. и вот, хочу обсудить одну довольно общую проблему : ввод документа, состоящего из нескольких окон, связанных master-detail (один-ко-многим). Например, счёт-фактура может состоять из 1. заголовка 2. списка позиций 3. перечня дополнительных свойств для каждой позиции Пользователь должен иметь возможность сначала ввести документ целиком (или даже ввести несколько документов), и только потом -- сохранить (или отменить ввод). Собственно проблема: чтобы привязать строки подчинённых окон к главным, необходимо знать значение Primary Key главного окна (и это до сохранения!). У нас на фирме было (давно) принято такое решение: отказаться от автогенерации Primary Key и генерировать значение уникального поля до вставки в таблицу (пересечения с данными, вводимыми другими пользователями, исключаются использованием при генерации функции SQL-сервера, возвращающей номер соединения, @@uuid) , а после ввода уже спокойно сохранять. Коллизии такой генерации PK пока (за три-четыре года эксплуатации) не встречались. Вопрос: 1. какие ещё алгоритмы ввода многооконных документов предложите? 2. как это реализовано в PFC (в этой библиотеке тоже ведь есть службы связи окон (спрашиваю потому, что сам я ещё не пользовался этой библиотекой) 3. какие есть недостатки предложенного здесь метода ввода документов -- с помощью генерации первичного ключа до вставки? (подробности генерации там же . спасибо! ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.04.2005, 16:13 |
|
||
|
генерация primary key до вставки
|
|||
|---|---|---|---|
|
#18+
Может это и неправильно, но последние десятилетия мои приложения, в основном, получают ID до формирования новой записи на клиенте. На псевдокоде - of_GetId () ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.04.2005, 17:30 |
|
||
|
генерация primary key до вставки
|
|||
|---|---|---|---|
|
#18+
Sorry, не туда нажал Продолжу На псевдоколе: Код: plaintext 1. 2. 3. 4. Вот и все, собственно. Да, чуть не забыл. Для MS SQL был разработан механизм, реализующий аналог сиквенса в Oracle. Разумеется, в БД уникальность первичных ключей обеспечивается по всей БД, т.е. используется только один сиквенс, кроме каких-то специальных случаев ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.04.2005, 17:37 |
|
||
|
генерация primary key до вставки
|
|||
|---|---|---|---|
|
#18+
Все-таки забыл :-) Разумеется, что функция of_GetId() обращается за ID к серверу. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.04.2005, 17:38 |
|
||
|
генерация primary key до вставки
|
|||
|---|---|---|---|
|
#18+
Можно завести еще одно поле для связи в DataWindow, а поле PK не трогать. Внутри DataWindow осуществлять связь master-detail по значениям второго поля, используя для новых записей отрицательную нумерацию (в базу естественно ничего не сохраняя из этого второго поля). А при SELECT'е заполнять его значениями из PK, в этом случае никаких коллизий произойти просто не может. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.04.2005, 21:55 |
|
||
|
генерация primary key до вставки
|
|||
|---|---|---|---|
|
#18+
Гм, у нас проблема была решена другим способом. При открытии окна документа в базу уже добавляется запись со всеми начальными значениями и сгенеренным идентификатором. Единственное запись помегена как "неактуальная". Соответственно при вставке перечня идентификатор известен, а при нажатии на клиенте кнопки OK идет обновление существующей записи введенными данными и изменение состояния записи на актуальное. Если "OK" не нажата, то в базе остается "паразитная" неактуальная запись. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.04.2005, 09:41 |
|
||
|
генерация primary key до вставки
|
|||
|---|---|---|---|
|
#18+
Локшин МаркМожно завести еще одно поле для связи в DataWindow, а поле PK не трогать. Внутри DataWindow осуществлять связь master-detail по значениям второго поля, используя для новых записей отрицательную нумерацию (в базу естественно ничего не сохраняя из этого второго поля). А при SELECT'е заполнять его значениями из PK, в этом случае никаких коллизий произойти просто не может. Почти так же. Новых полей не использую - пишу отрицательные значения как раз в поле PK - а в событии UpdateStart() отрицательные значения заменяю на уникальные из SEQUENS-последовательности (Oracle) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.04.2005, 09:43 |
|
||
|
генерация primary key до вставки
|
|||
|---|---|---|---|
|
#18+
gzПочти так же. Новых полей не использую - пишу отрицательные значения как раз в поле PK - а в событии UpdateStart() отрицательные значения заменяю на уникальные из SEQUENS-последовательности (Oracle) Можно и так, но шанс словить ошибку при кодировании таким образом выше. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.04.2005, 13:06 |
|
||
|
генерация primary key до вставки
|
|||
|---|---|---|---|
|
#18+
понятно, спасибо за примеры. а чем так генерация первичного ключа на сервере не нравится? Наши утверждают (я сам не пробовал), что если пользоваться генерацией ключа на сервере (сиквенсы, identity и что там в Sybase-вский СУБД?), то может измениться порядок строк после insert\retrieve, правда, я не понял, почему. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.04.2005, 13:08 |
|
||
|
генерация primary key до вставки
|
|||
|---|---|---|---|
|
#18+
Локшин МаркМожно и так, но шанс словить ошибку при кодировании таким образом выше. А каким образом ? Сколько лет ловим, пока сетка пустая. Если перестраховываться, то уж в меру ... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.04.2005, 13:20 |
|
||
|
генерация primary key до вставки
|
|||
|---|---|---|---|
|
#18+
gzА каким образом ? Сколько лет ловим, пока сетка пустая. Если перестраховываться, то уж в меру ... Допустим нужно будет откатиться, тогда это нужно тоже нужно учитывать при кодировании. Имееются ввиду ошибки программиста при реализации механизма на PB. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.04.2005, 13:35 |
|
||
|
генерация primary key до вставки
|
|||
|---|---|---|---|
|
#18+
Локшин МаркДопустим нужно будет откатиться, тогда это нужно тоже нужно учитывать при кодировании. Имееются ввиду ошибки программиста при реализации механизма на PB. Что-й-то плохо соображаю. Вроде бы, и при откатах работает. Может быть, имеете ввиду просто "кривые ручки" программиста ? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.04.2005, 13:49 |
|
||
|
генерация primary key до вставки
|
|||
|---|---|---|---|
|
#18+
savosin_sergeyпонятно, спасибо за примеры. а чем так генерация первичного ключа на сервере не нравится? Наши утверждают (я сам не пробовал), что если пользоваться генерацией ключа на сервере (сиквенсы, identity и что там в Sybase-вский СУБД?), то может измениться порядок строк после insert\retrieve, правда, я не понял, почему. Смотря в какой Sybase СУБД. Если в ASA 9, то просто пишем в клиенте <SELECT GET_IDENTITY('TableName') >, получаем собственный зарезервированный ID, автоматом увеличивая инкримент в таблице без организации транзакции и вообще больше ни о чем не думаем :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.04.2005, 13:50 |
|
||
|
генерация primary key до вставки
|
|||
|---|---|---|---|
|
#18+
Локшин Марк gzА каким образом ? Сколько лет ловим, пока сетка пустая. Если перестраховываться, то уж в меру ... Допустим нужно будет откатиться, тогда это нужно тоже нужно учитывать при кодировании. Имееются ввиду ошибки программиста при реализации механизма на PB. Откаты на SEQUENS и IDENTITY не влияют, так что ошибок не будет. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.04.2005, 13:51 |
|
||
|
генерация primary key до вставки
|
|||
|---|---|---|---|
|
#18+
ASCRUS Откаты на SEQUENS и IDENTITY не влияют, так что ошибок не будет. Не про те ошибки идет речь. gzМожет быть, имеете ввиду просто "кривые ручки" программиста ? Да, именно это я и пытался сказать :) Больше нюансов в реализации, а сл-но больше вероятность ошибки (программиста). ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.04.2005, 13:58 |
|
||
|
генерация primary key до вставки
|
|||
|---|---|---|---|
|
#18+
Локшин Марк gzМожет быть, имеете ввиду просто "кривые ручки" программиста ? Да, именно это я и пытался сказать :) Больше нюансов в реализации, а сл-но больше вероятность ошибки (программиста). Как раз добавление в SELECT дополнительного поля (не поля базы данных + специальным образом заполняемого) и дает дополнительные навороты. Хотя, чего мы спорим ? У нас реализация совпала процентов на 90-95. Значит, "верным путем идем, товарищи" ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.04.2005, 14:06 |
|
||
|
генерация primary key до вставки
|
|||
|---|---|---|---|
|
#18+
savosin_sergeyпонятно, спасибо за примеры. а чем так генерация первичного ключа на сервере не нравится? Наши утверждают (я сам не пробовал), что если пользоваться генерацией ключа на сервере (сиквенсы, identity и что там в Sybase-вский СУБД?), то может измениться порядок строк после insert\retrieve, правда, я не понял, почему.Гм... Не понял. Порядок строк обеспечивается конструкцией ORDER BY в запросе или сортировкой на клиенте. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.04.2005, 14:47 |
|
||
|
генерация primary key до вставки
|
|||
|---|---|---|---|
|
#18+
PL99Гм... Не понял. Порядок строк обеспечивается конструкцией ORDER BY в запросе или сортировкой на клиенте. Случай из жизни. Армия. Вон, розетка - какой ток течет - постоянный или переменный ? Ответ - постоянный. Вышел товарищ. А ты, меня спрашивают - понял ? Ну, говорю, постоянный - прямая, а переменный - синусоида. Нет, говорят, вышедший товарищ имел ввиду, что постоянный - это 220 вольт не больше и не меньше. Так что PL99, не забивай себе голову, что имел ввиду товарищ ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.04.2005, 15:17 |
|
||
|
генерация primary key до вставки
|
|||
|---|---|---|---|
|
#18+
я имел ввиду порядок строк в таблице без order'а. то есть, добавили несколько новых записей, визуально они появились в конце datawindow, а после retrieve (=select col1, col2, ... from table1 where parent_id=xxx) -- некоторые записи могут своё место в DW изменить.. но я это не видел, передаю лишь слова.. и не могу понять, почему, ведь нет сортировки даже по первичному ключу.. Хотя, на мой взгляд, причины генерации первичного ключа другие (нежели простое соблюдение порядка строк в DW): 1. возможность заполнять несколько master'ов с detail'ами внутри (привязка строк в detail'е до сохранения master'а). 2. на сервере средства работы с identity (автогенератором числового первичного ключа) не понравились главному разработчику (напр., потому что реализованы кривова-то или, там, требуют вызова хранимой процедуры) Как выяснилось, у нас именно второй случай. а при вводе нового master'а происходит тихое сохранение введённых dateil'ов для строки, потерявшей фокус ввода. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.04.2005, 17:46 |
|
||
|
генерация primary key до вставки
|
|||
|---|---|---|---|
|
#18+
savosin_sergeyя имел ввиду порядок строк в таблице без order'а. то есть, добавили несколько новых записей, визуально они появились в конце datawindow, а после retrieve (=select col1, col2, ... from table1 where parent_id=xxx) -- некоторые записи могут своё место в DW изменить.. но я это не видел, передаю лишь слова.. и не могу понять, почему, ведь нет сортировки даже по первичному ключу.. Для любой реляционной операции порядок следования кортежей отношений никогда не определен. В конкретном частном случае записи по запросу Код: plaintext Или в порядке физического местоположения записей записей в таблице table1 (в зависимости от селективности условия parent_id). Но это никто и никому не обязан. Допустим, все может измениться от числа процессоров в системе savosin_sergey на сервере средства работы с identity (автогенератором числового первичного ключа) не понравились главному разработчику И какие же альтернативы? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.04.2005, 18:31 |
|
||
|
генерация primary key до вставки
|
|||
|---|---|---|---|
|
#18+
to savosin_sergey Выборка строк "без ордера". В общем-то, реляционная база не гарантирует последовательность вывода строк в порядке их ввода. Хотя некоторое подобие порядка при полупустой базе может и наблюдаться. Вопрос по сохранению сортировки при повторном вызове формы имеет иногда принципиальное значение. Можно, конечно, использовать уникальный ключ для сортировки (помучаться при этом), но лучше добавить просто поле "номер строки" в таблицу. "Тихое сохранение" - это что-то новое. Какие-то нехорошие ассоциации. Конечно, от ошибок никто не застрахован, однако, если таких ситуаций много, бежать надо скорее от таких разработчиков. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.04.2005, 18:34 |
|
||
|
генерация primary key до вставки
|
|||
|---|---|---|---|
|
#18+
Локшин МаркИ какие же альтернативы? Вот алгоритм генерации нового уникального значения, применяемый у нас (в классах, работающих со связанными DW).. Правда, эта функция немного переделанная (работает лишь с одной таблицей bu_extravalues , но, жумаю, смысл будет ясен.. Переменные gnv_appl.i_step и gnv_appl.i_spid заполняются при запуске приложения. Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.04.2005, 12:18 |
|
||
|
генерация primary key до вставки
|
|||
|---|---|---|---|
|
#18+
авторВот алгоритм генерации нового уникального значения, применяемый у нас (в классах, работающих со связанными DW).. Правда, эта функция немного переделанная (работает лишь с одной таблицей bu_extravalues, но, жумаю, смысл будет ясен.. Переменные gnv_appl.i_step и gnv_appl.i_spid заполняются при запуске приложения. И в чем же преимущества? Абсолютно не гарантируется никакой уникальности сгенерированных значений. Что, у одного пользователя не может быть несколько connect'ов к базе? Что достигается в результате такого извращения? Это если у вас главный разработчик такое пишет... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.04.2005, 12:44 |
|
||
|
генерация primary key до вставки
|
|||
|---|---|---|---|
|
#18+
авторЧто, у одного пользователя не может быть несколько connect'ов к базе? Что достигается в результате такого извращения? Номер коннекшена (через который будет производиться insert) всегда уникальен, среди всех подключённых пользователей. У одного пользователя можут быт два коннекта, но с разными @@spid. Так что коллизий не наблюдается (уже больше трёх лет фурычит в минфине, там пользователей около 100, данные вводят человек 5) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.04.2005, 13:14 |
|
||
|
генерация primary key до вставки
|
|||
|---|---|---|---|
|
#18+
другими словами, у SQLCA всегда один коннект, и у него есть уникальный номер на сервере (среди всез поключений к серверу). Как этот номер узнать в oracle или в sybase-вских СУБД я не знаю. в MsSqlServer это переменная @@spid ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.04.2005, 13:21 |
|
||
|
|

start [/forum/topic.php?fid=15&msg=33035612&tid=1338384]: |
0ms |
get settings: |
10ms |
get forum list: |
20ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
85ms |
get topic data: |
11ms |
get forum data: |
3ms |
get page messages: |
66ms |
get tp. blocked users: |
2ms |
| others: | 253ms |
| total: | 458ms |

| 0 / 0 |
