Н. 3. Елманова. C++Builder 3.0, архитектура "клиент/сервер" и Internet
ском приложении. Какую из реализаций выбрать, зависит от размера справочной таблицы - локальные фильтры могут быть более производительны, чем параметризованный запрос, если таблица целиком кэшируется на рабочей станции, т. е. ее объем сравним с емкостью буферов для кэширования данных.
Отметим также, что в списке пациентов могут быть полные тезки. В этом случае следует создать в списке пациентов вычисляемое поле (например, включающее фамилию, имя, отчество и дату рождения пациента) и использовать его для поиска.
4.5     О генерации уникальных первичных ключей
Еще одним серьезным недостатком подобной информационной системы является необходимость ввода пользователем значений первичных ключей, что в данном примере особенно критично для списка пациентов и" списка посещений. В этом случае весьма высока возможность ошибки, связанной с вводом значения, уже имеющегося в базе данных. Причиной может быть как ошибка самого оператора, так и попытка одновременного ввода одного и того же значения с разных рабочих станций сети.
Проблема подобного рода может быть решена с помощью автоматической генерации уникальных первичных ключей как в клиентском приложении, так и на сервере. В приложении генерация первичного ключа осуществляется, например, путем создания длинной случайной символьной строки с помощью какого-либо генератора, использующего в качестве параметров время с точностью до долей секунды и какие-либо уникальные характеристики рабочей станции так, чтобы вероятность повторов была чрезвычайно • мала. Этот способ обычно применяется при работе с теми СУБД, которые сами не поддерживают возможность генерации таких ключей (например, dBase). Он неудобен, так как при наличии нескольких различных приложений, использующих одну и ту же базу данных, требуется в каждом из них повторить код, отвечающий за генерацию первичных ключей.
Более предпочтительным способом является использование возможностей генерации первичных ключей, содержащихся в самой СУБД. Эту возможность поддерживает большинство серверных СУБД, а также некоторые настольные СУБД (например, Paradox, позволяющий создавать в таблицах автоинкрементные поля).
В качестве примера рассмотрим, как можно использовать возможности генерации первичных ключей, предоставляемые Oracle, для автоматического заполнения поля TAG таблицы VISIT. С этой целью воспользуемся генератором последовательностей Oracle, создающим последовательности уникальных целых чисел, употребляемых клиентскими приложениями в каче-
74
О проектировании данных
стве значений первичных ключей. Создадим такую последовательность с помощью следующего набора операторов (исполнить их можно, например, с помощью SQL Plus или с помощью закладки Enter SQL):
create sequence seqtag
start with 200
increment by 1
nominvalue
nomaxvalue
nocycle
nocache
Можно   также   создать   последовательность   непосредственно   в   SQL Explorer, описав ее характеристики (рис. 4.11).
Р SQL Explorer                                                                       Е1Ш!ЕЗ|	
Object   Dictionary   Edit   View   Options   Help	
X' '" ". •,....••',.              4:;---.'" '. ,-;••    ,, * ;  •:, ••••   4- •"••*•    '	Definition of MEDICI .SEQTAG Definition 1 ТехГ  1 Enter SQL-):./ '      :  :;;;:,•.•  '   '              .  ;.-.'.•>::*. " "' '' I
All Database Aliases             '-''•-' Databases;,] Dictionary | :. :,,,! ;:,.:..	
SI- в Synonyms                          ж| й- ft Snapshots Ш ft Clusters ffi ft TableSpaces Й- ft Sequences	Valid               Yes Created          20.12.9719:38:03; Modified       \2Q. 12. 97 19: 38:08' LastValue   ' ' J63 ................. .....1......  j Increment By     1
:     шяШНШЛШ ffi ft Procedures Ё! (ii) Functions ffi- ft Packages ffl- ft Package Bodies 1 "@  Text Files                               — i 1? Xtreme sample data                  T.I •j.A? V'<:'   ^^•ЦРМ^^'Й'   vi                                     1     bf	Cycle L.... ...... ......; N°.... ....._..._........ In Order          ;No Minimum Value |1 Maximum Value | None Cache Size       i None
	
o'iiiigiiisiaiAG.                                 :--ш	
Puc, 4.11. Создание последовательности в SQL Explorer
На главной форме приложения заменим компонент TDBEdit, в который ранее вводилось значение поля TAG, компонентом TDBText, чтобы исключить возможность ввода этого значения пользователем. В модуль данных нашего клиентского приложения поместим компонент TUpdateSQL, выберем его имя в качестве значения свойства UpdateObject компонента ТТаЫе,
75