|
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
АвтоАвтоматизацияАрхитектураАстрономияАудитБиологияБухгалтерияВоенное делоГенетикаГеографияГеологияГосударствоДомДругоеЖурналистика и СМИИзобретательствоИностранные языкиИнформатикаИскусствоИсторияКомпьютерыКулинарияКультураЛексикологияЛитератураЛогикаМаркетингМатематикаМашиностроениеМедицинаМенеджментМеталлы и СваркаМеханикаМузыкаНаселениеОбразованиеОхрана безопасности жизниОхрана ТрудаПедагогикаПолитикаПравоПриборостроениеПрограммированиеПроизводствоПромышленностьПсихологияРадиоРегилияСвязьСоциологияСпортСтандартизацияСтроительствоТехнологииТорговляТуризмФизикаФизиологияФилософияФинансыХимияХозяйствоЦеннообразованиеЧерчениеЭкологияЭконометрикаЭкономикаЭлектроникаЮриспунденкция |
Формы и компоненты для отображения результатов запросовВВЕДЕНИЕ
Предпосылкой создания базы данных являлось огромное количество накопленной информации, которую необходимо было хранить в памяти компьютера и обрабатывать наиболее удобным способом. Исторически сложилось так, что СУБД берет свое начало с середины 60-х годов, когда компания IBM совместно с фирмой North American Aviation (NAA) разработали первую СУБД – иерархическую систему Information Management System. В современном мире без базы данных не обходится ни одна деятельность какой-либо компании. Большой объем информации, изложенный на бумаге необходимо как-то систематизировать и упорядочить, а также уберечь его от повреждений и утраты. Кроме того, в связи с тем, что различные учреждения одной компании могут быть разбросаны по всему миру, встает вопрос о том, как же передать накопленную информацию. Учитывая современное развитие технологий, все вышеперечисленные проблемы может разрешить информационная система, а именно СУБД. Это доказывает незаменимость баз данных в вопросах, касающихся сбора и накопления информации. Беря во внимание факт того, что на сегодняшний день любая обработка и накопление информации происходит с применением СУБД, можно с уверенностью сказать, что тема данной работы является актуальной. 1. КОМПОНЕНТЫ СРЕДЫ DELPHI 7 ДЛЯ РАБОТЫ С БД
1.1. Невизуальные компоненты Delphi: 1.1.1. Класс TDataSet Класс TDataSet является базовым для TTable, TQuery И TStoredProc. Многие свойства, методы и события, используемые указанными классами, на самом деле определены в TDataSet. Из-за наследования производными классами большого количества элементов TDataSet, я сначала перечислю основные свойства, методы и события TDataSet, а затем перейду к свойствам, методам и событиям, специфическим для каждого производного класса. Наиболее часто используемые свойства, методы и события класса TDataSet приведены в таблицах 1.1, 1.2 и 1.3. Таблица 1.1. Основные свойства TDataSet
Таблица 1.2. Основные методы TDataSet
Таблица 1.3. Основные события TDataSet
1.1.2. Компонент TTable Компонент Table, представленный классом TTable, обеспечивает самый быстрый и простой доступ к таблице. Использования таблиц более чем достаточно для большинства приложений, работающих с одноярусными базами данных. Обычно вы будете использовать компонент Table для локальных баз данных, а компонент Query — для работы с SQL-серверами. Класс TTable имеет большое количество дополнительных свойств и методов по сравнению со своим предком, TDataSet. В таблице 1.4 перечислены важнейшие свойства компонента ТТаblе, а в таблице 1.5 — методы. Помните, что это свойства и методы, специфичные для ТТаblе; в их число не входят те, которые этот класс наследует от TDataSet. По большей части смысл свойств и методов ТТаblе интуитивно понятен. Иными словами, вам достаточно взглянуть на имя свойства или метода, чтобы определить его назначение. Не требуется затрачивать больших умственных усилий, чтобы понять, что метод LockTable блокирует таблицу, используемую в приложении, а метод UnLockTable снова ее разблокирует. Точно так же, вам не обязательно иметь IQ в 150 единиц, чтобы догадаться о назначении методов CreateTable, DeleteTable И RenameTable. По этой Причине я не собираюсь подробно рассматривать все свойства и методы, перечисленные здесь. Вместо этого давайте остановимся на некоторых более интересных аспектах компонента Table. Таблица 1.4. Основные свойства ТТаblе
Таблица 1.5. Основные методы ТТаblе
1.1.3. Компонент TQuery Использование компонента Query является предпочтительным способом доступа к базам данных клиент/сервер. В этом разделе описаны основные свойства и методы класса TQuery. Компонент Query, в отличие от компонента Table, не имеет свойства TableName Это означает, что во время проектирования вы не можете увидеть список таблиц текущей базы данных Для просмотра списка таблиц можно сделать одно из двух Во-первых, можно временно поместить на форму компонент Table и установить его свойство DatabaseMame, после чего список свойства TableName будет содержать доступные таблицы Во-вторых, можно выделить компонент Query на форме, щелкнуть на нем правой кнопкой мыши и выбрать в контекстном меню пункт Explore Вы окажетесь либо в SQL Explorer (версия Client/Server), либо в администраторе BDE (версии Standard и Professional) Для просмотра таблиц базы данных можно использовав любой из этих инструментов
1.1.4. Компонент TField Класс TField представляет поле (столбец) базы данных. Через этот класс вы можете установить атрибуты поля. К атрибутам поля относятся тип данных (строковый, целый, с плавающей точкой и т. д.), размер поля, индекс, используется ли это поле в вычислениях и т. п. Вы можете получить или установить значение поля через свойства AsString, AsVariant И AsInteger. TField является базовым классом для специализированных классов полей. К потомкам TField относятся TStringField, TIntegerField, TSmallIn-tField, TWordField, TFloatField, TCurrencyField, TBCDField, TBooleanFi-eld, TDateTimeField, TDateField, TBIobField, TBytesField, TVarBytesFi-eld, TMemoField и TGraphicField. Эти производные классы расширяют базовый класс, добавляя новые функциональные возможности. Например, классы числовых полей имеют свойство DisplayFormat, которое определяет способ отображения чисел, а также свойство EditFormat, которое определяет вид чисел во время редактирования. Каждый потомок TField соответствует определенному типу поля базы данных. Класс TIntegerField используется для полей целого типа, класс TTimeField — для полей, содержащих дату или время (или дату/время), класс TBIobField — для полей, содержащих большие двоичные объекты, и т. д. Свойства и методы TField настолько многочисленны, что перечислять их все довольно долго. Вместо рассмотрим, каким образом чаще всего используются TField и его производные классы. Доступ к полям Чтобы получить или установить значение поля, необходимо иметь к нему доступ. Это можно сделать по крайней мере тремя способами: - По имени указателя - Через свойство Fields класса TDataSet - Через метод FieldByName класса TDataSet Доступ к полю по имени указателя используется, по-видимому, реже всего. Он работает только в том случае, если вы предварительно добавили поля к проекту с помощью редактора полей. Когда вы добавляете поля через редактор полей, Delphi создает для каждого поля указатель, имя которого составляется из имени таблицы и имени поля. Если у вас есть таблица Table! и строковое поле FirstName, указатель на объект TStringField получит имя TablelFirstName. Вы можете использовать этот указатель для доступа к полю: Table1.FirstName.Value:= 'Per'; Проблема с таким подходом состоит в том, что вам не всегда нужно добавлять поля через редактор. Свойство Fields предлагает другой способ доступа к полю — по его положению в таблице. Если вы знаете, что поле LastName стоит в таблице первым, можно сделать примерно следующее: Edit1.Text:= Table1.Fields[0].Value; В данном случае проблема, очевидно, состоит в том, что вы должны знать точный порядок полей. Из трех способов доступа к полям наиболее распространенным и надежным является использование метода FieldByName. Для доступа к полю через FieldByName вы должны знать только имя этого поля: Table1.FieldByName('LastName').AsString:= Edit1.Text; FieldByName возвращает указатель на TField. Для большей ясности разделим предыдущую строку кода: var Field: TField; begin Field:= Table1.FieldByName('LastName'); Field.AsString:= Edit1.Text; end; В большинстве случаев FieldByName представляет собой именно то, что нужно. Да, остался еще один вопрос — какая запись будет модифицирована в результате выполнения предыдущего кода. Все рассмотренные способы возвращают поле из текущей записи. Извлечение и установка значений полей После получения указателя на конкретное поле вы можете изменять его значение с помощью свойства value или любого из свойств As. Под свойствами As Я имею В виду AsString, Aslnteger, AsDateTime, AsBoolean и т. д. Эти свойства выполняют преобразования между разными типами данных. Естественно, преобразование возможно не во всех случаях. Например, если вы попытаетесь преобразовать строковое поле со значением Smith к целому типу, будет возбуждено исключение. Установка значения поля очень проста, если вы знаете секрет FieldByName: Table1.Edit; Table1.FieldByName('LastName').AsString:= Edit1.Text; Table1.Post; Сначала вызывается метод Edit, который переводит таблицу в режим редактирования. Если вы не вызовете Edit, то получите исключение при попытке изменения значения поля. После того, как таблица переведена в режим редактирования, устанавливается новое значение поля. В данном случае я использую AsString вместо свойства Value. Для строкового поля это в любом случае одно и то же. В завершение вызывается метод Post, который отправляет изменения в базу данных (или кэш изменений, если включено свойство СасhedUpdates). Вот и все. Извлечение значения поля выполняется еще проще: int AcctNo:= Tablel.FieldByName('ACCT NBR').Value;
1.1.5. Компонент TDataSource Компонент DataSource обеспечивает механизм для связи компонентов доступа к данным (Table, Query или StoredProc) с визуальными компонентами, которые отображают данные (DBGrid, DBEdit, DBListBox и т. д.). Основное назначение DataSource состоит в том, чтобы облегчить внесение изменений в приложения. Все визуальные компоненты данных на форме связаны с DataSource, который, в свою очередь, связан с набором данных. Поскольку компоненты данных не обращаются напрямую к набору данных, вы можете с легкостью менять наборы данных без необходимости каждый раз устанавливать связи со всеми компонентами формы. Например, для замены набора данных с Table на Query вам достаточно лишь изменить свойство DataSet компонента DataSource. TDataSource имеет очень мало свойств. Как вы уже видели, свойство Data-Set используется для связи DataSource с набором данных. Свойство Enabled определяет, будут ли интерфейсные компоненты, связанные с DataSource, отображать данные. Когда это свойство имеет значение True, данные отображаются. В противном случае компоненты отображения данных остаются пустыми. Методы TDataSource по большей части несущественны, поэтому не имеет смысла их здесь рассматривать. Событие OnDataChange генерируется при перемещении курсора с редактировавшейся записи на любую другую. Событие OnStateChange происходит в момент изменения состояния набора данных (например, когда пользователь переключается из режима редактирования в режим просмотра).
1.1.6. Сходства и различия компонентов TTable и TQuery Хотя компоненты TTable и TQuery и являются потомками класса TDataSet и во многом, методика работы с объектом TQuery похожа на методику работы с TTable, однако есть свои особенности. Поскольку в ряде случаев компоненты TTable и TQuery в приложениях взаимозаменяемы, то возникает вопрос – какой же из них использовать? При работе с локальными базами данных чаще используется Table. С его помощью проще не только просматривать таблицу базы данных, но и модифицировать записи, удалять их, вставлять новые. Но при работе с клиент - серверными базами данных компонент Table становится мало эффективным. В этом случае он создает на компьютере пользователя временную копию серверной базы данных и работает с этой копией. Естественно, что подобная процедура требует больших ресурсов и существенно загружает сеть. Этот недостаток отсутствует в компоненте Query. Если запрос SQL сводится к просмотру таблицы (запрос Select), то результат этого запроса (а не сама исходная таблица) помещается во временном файле на компьютере пользователя. Правда, в отличии от набора данных, создаваемого Table, это таблица только для чтения и не допускает каких-то изменений. Впрочем, это ограничение можно обойти. Если же запрос SQL связан с какими-то изменениями содержания таблицы, то никаких временных таблиц не создается. BDE передает запрос на сервер, там он обрабатывается и в приложение возвращается информация о том, успешно ли завершена соответствующая операция. Благодаря такой организации работы эффективность Query при работе в сети становится намного выше, чем эффективность Table. К тому же язык SQL,позволяет формулировать сложные запросы, которые не всегда можно реализовать в Table. С другой стороны при работе с локальными данных эффективность Query заметно ниже эффективности Table. Замедление вычислений получается весьма ощутимым. Исходя из этого краткого обзора возможностей Table и Query, можно заключить, что в клиент – серверных приложениях целесообразней использовать компонент Query, а при работе с локальными базами данных где не нужна мощь компонента Query проще использовать Table.
1.2. Визуальные компоненты Delphi
1.2.1. Компонент TLable Компонент Label (метка) используется для отображения текста на форме. Иногда текст метки определяется уже во время проектирования и никогда не изменяется. В других случаях метка ведет себя динамически и изменяется во время выполнения программы. Для задания текста метки во время выполнения используется свойство Caption. Компонент Label не имеет никаких специализированных методов или событий кроме тех, что имеются у других компонентов. В таблице 1.6 перечислены специфические свойства компонента Label. Таблица 1.6. Свойства компонента Label
1.2.2. Компонент TDBEdit Компонент DBEdit представляет собой элемент редактирования, который связан с полем набора данных. Компонент DBEdit имеет только те свойства, методы и события, которые являются общими для всех компонентов данных.
1.2.3. Компонент TDBNavigator Компонент DBNavigator предоставляет пользователю возможность просматривать набор данных. Навигатор содержит кнопки для перехода на первую, последнюю, предыдущую и следующую записи, вставки, удаления и редактирования записи, отмены и сохранения изменений, а также обновления данных. Этот компонент практически полностью автоматизирован, поэтому все, что вам остается сделать в большинстве случаев — это поместить его на форму, связать с DataSource и забыть о нем. Свойство ConfirmDelete, будучи установлено в True, вызывает отображение диалоговой панели при каждом нажатии на кнопку Delete. Установкой значения True для свойства Hint включаются всплывающие подсказки для кнопок. Свойство VisibleButtons представляет собой множество и позволяет вам управлять отображением кнопок на панели навигатора. Вы можете добавлять и удалять кнопки как на этапе проектирования, так и во время выполнения программы. DBNavigator имеет только один метод, представляющий интерес, и одно событие. Вы можете использовать метод BtnClick для имитации нажатия кнопки навигатора. Событие OnClick предназначено для детектирования нажатия кнопки. Использование этого события требуется редко, поскольку навигатор сам знает, как реагировать на нажатия своих кнопок.
1.2.4. Компонент TDBImage Компонент DBImage используется для вывода больших двоичных объектов (BLOB — binary large object), имеющих формат изображения. Этот компонент не обязательно будет предназначен только для чтения. Вы можете изменить изображение, вставив его из буфера обмена или используя свойство Picture для загрузки файла с диска. В следующем примере изображение меняется в процессе выполнения программы: DBImage1.Picture.LoadFromFile('peregrine.bmp'); Основные свойства DBImage управляют выводом изображения. Свойство AutoDisplay работает точно так же, как и для компонента DBMemo. Метод loadPicture может использоваться для загрузки изображения, когда AutoDisplay имеет значение False. Свойство picture разрешает доступ к изображению и выполняет те же функции, что и в стандартном компоненте Image. Свойство Center определяет, будет ли изображение центрировано относительно окна DBImage. Свойство Stretch определяет, будет ли изображение растянуто до размеров окна DBImage или сохранит свой исходный размер. Если Stretch имеет значение False, а изображение не помещается в окне, то оно будет обрезано. От свойства QuickDraw зависит, будет ли применяться палитра при выводе изображения. Если QuickDraw имеет значение False, палитра используется. Это улучшает качество изображений, но несколько снижает скорость вывода на экран. К методам компонента DBImage относятся CutToClipboard, CopyToClipboard и PasteFromClipboard. Их назначение полностью соответствует названиям.
1.2.5. Компонент TDBGrid Компонент DBGrid отображает набор данных в формате электронной таблицы. Одним из важнейших свойств DBGrid является свойство columns. Оно позволяет вам изменять номера и порядок столбцов, которые появляются в таблице. Вы можете добавить, удалить или упорядочить столбцы с помощью редактора столбцов (Columns Editor). Для вызова редактора столбцов щелкните правой кнопкой мыши на таблице и выберите пункт Columns Editor в контекстном меню. Вы можете также щелкнуть на кнопке с многоточием рядом со свойством Columns в инспекторе объектов. Используя редактор столбцов, вы можете добавлять и удалять столбцы, или изменять порядок их расположения. Например, набор данных может содержать десятки полей, но вам требуется просматривать в DBGrid только половину из них. С помощью редактора столбцов вы можете скрыть те поля, которые не должны отображаться. .Не путайте свойство Columns компонента DBGrid (модифицируемое через редактор столбцов) со свойством FieldDefs компонента Table (которое модифицируется с помощью редактора полей) Свойство FieldDefs определяет, какие столбцы реально находятся в наборе данных Свойство columns влияет только на видимость полей в сетке DBGrid. Свойство DefaultDrawing определяет, будут ли ячейки сетки нарисованы VCL, или их будет рисовать пользователь. Если для DefaultDrawing установлено значение False, вы должны реагировать на события OnDrawColumnCell и OnDrawDataCell, чтобы обеспечить рисование ячеек. Свойство Options позволяет вам установить опции, определяющие отображение и поведение сетки. С помощью этого свойства вы можете выключить заголовки столбцов, разрешить или запретить изменение размера столбцов, включить или выключить отображение разделительных линий столбцов и строк, и т. д. Свойство Title Font позволяет вам задать шрифт для заголовков столбцов, а свойство Font определяет шрифт для ячеек таблицы. DBGrid имеет только два открытых метода. При работе с пользовательской сеткой вы можете вызвать методы DefaultDrawColumnCell и DefaultDrawDataCell для рисования стандартных ячеек. Это полезно, если вы самостоятельно рисуете только некоторые столбцы, а для остальных хотите оставить поведение по умолчанию. Компонент DBGrid имеет несколько событий, большинство из которых относится к редактированию ячеек и перемещению по таблице. Я не буду перечислять здесь эти события, поскольку их назначение очевидно из названий.
1.3. Создание простых клиентских приложений с использованием базовых компонентов Delphi для работы c базами данных. Самый простой способ создания формы для работы с базами данных – это использование мастера Form Wizard. Этот мастер позволяет создавать шаблоны формы полностью работающегоприложения для: - просмотра и редактирования одной таблицы базы данных; - просмотра и редактирования двух таблиц, соединенных отношением родительская-дочерняя. 1.3.1. Для того, чтобы создать шаблон приложения, работающего с одной таблицей, следует: - Создать новый проект. - Запустить мастер Form Wizard, выполнив команду меню Database |Form Wizard.
- Выбрать в первом открывшемся диалоге Database Form Wizard (рис. 1.1) тип создаваемой формы: - simple- форма для построения и редактирования одной таблицы.
Рисунок 1.1 – Диалог Database Form Wizard – 1 шаг
- Выбрать тип объекта набора данных: TTable. В этом случае для работы с таблицей будет использован компонент TTable. После определения всех параметров нажать Next. - Выбрать во втором диалоге Database Form Wizard (рис. 1.2) каталог расположения базы данных (в данном примере это каталог стандартной базы данных DBDEMOS) и необходимую таблицу (в данном примере - animals.dbf).
Рисунок 1.2 – Диалог Database Form Wizard – 2 шаг
- В третьем диалоге Database Form Wizard (рис. 1.3) все поля из левого списка поместить в создаваемую форму, щелкнув по кнопке >>.
Рисунок 1.3 – Диалог Database Form Wizard – 3 шаг
- В четвертом диалоге Database Form Wizard (рис. 1.4) определить порядок следования элементов на форме, как горизонтальный или вертикальный.
Рисунок 1.4 – Диалог Database Form Wizard – 4 шаг
- В пятом диалоге Database Form Wizard (рис. 1.5) укажите, является ли создаваемая форма главной формой приложения. - Тут же следует выбрать место расположения невизуальных компонентов: набора данных (TTable или TQuery) и источника данных (TDataSourse). Они могут быть расположены на форме или в отдельном модуле данных. Во втором случае этот модуль данных может быть использован для нескольких форм. Нажать Finish. Запустить проект, нажав F9. .
Рисунок 1.5 – Диалог Database Form Wizard – 5 шаг 1.3.2. Для того, чтобы создать шаблон приложения, работающего с двумя таблицами, следует: - Создать новый проект. - Запустить мастер Form Wizard, выполнив команду меню Database |Form Wizard. - Выбрать в первом открывшемся диалоге Database Form Wizard (рис. 1.6) тип создаваемой формы: - Master/detail - форма для построения и редактирования двух таблиц, связанных отношением родительская-дочерняя.
Рисунок 1.6 – Диалог Database Form Wizard – 1 шаг
- Выбрать тип объекта набора данных: TQuery. - После определения всех параметров нажать Next. - Выбрать во втором диалоге DatabaseForm Wizard(рис. 1.7) каталог расположения базы данных (в данном примере это каталог стандартной базы данных DBDEMOS) и родительскую таблицу. В данном примере родительская таблица – customer.db.
Рисунок 1.7 – Диалог Database Form Wizard – 2 шаг
- В третьем диалоге DatabaseForm Wizard(рис. 1.8) все поля из левого списка поместить в создаваемую форму, щелкнув по кнопке >> -
Рисунок 1.8 – Диалог Database Form Wizard – 3 шаг
- В четвертом диалоге Database Form Wizard (рис. 1.9) определить порядок следования полей, как горизонтальный или вертикальный
Рисунок 1.9 – Диалог Database Form Wizard – 4 шаг
- В пятом диалоге Database Form Wizard (рис. 1.10) выберите имя дочерней таблицы.
Рисунок 1.10 – Диалог Database Form Wizard – 5 шаг
- В шестом диалоге Database Form Wizard (рис. 1.11) все поля из левого списка поместить в создаваемую форму, щелкнув по кнопке >>.
Рисунок 1.11 – Диалог Database Form Wizard – 6 шаг
- В седьмом диалоге Database Form Wizard (рис. 1.12) выделите третий пункт, чтобы дочерняя таблица отображалась в созданной форме в виде таблицы.
Рисунок 1.12 – Диалог Database Form Wizard – 7 шаг
- В восьмом диалоге Database Form Wizard(рис. 1.13) определите поле, по которому будет устанавливаться связь между таблицами. Выберите на панели Detail Field поле дочерней таблицы (внешний ключ), а на панели Master Field – поле родительской таблицы (первичный ключ), затем щелкните по кнопке Add. В результате в создаваемой форме будут отображаться только те записи из дочерней таблицы, в которых значение выбранного в качестве ключа поля совпадает со значением поля из родительской таблицы в активной записи.
Рисунок 1.13 – Диалог Database Form Wizard – 8 шаг
- В девятом диалоге Database Form Wizard (рис. 1.14) укажите, является ли создаваемая форма главной формой приложения.
Рисунок 1.14 – Диалог Database Form Wizard – 9 шаг
- Тут же следует выбрать место расположения невизуальных компонентов: набора данных (TTable или TQuery) и источника данных (TDataSourse). Они могут быть расположены на форме или в отдельном модуле данных. Во втором случае этот модуль данных может быть использован для нескольких форм. Нажать Finish. Запустить проект, нажав F9.
2. СОЗДАНИЕ БАЗЫ ДАННЫХ С ИСПОЛЬЗОВАНИЕМ СУБД INTERBASE 2.1. Проектирование схемы БД Концептуальная модель данных – модель, которая отображает объекты предметной области и взаимосвязи между ними, обеспечивает независимость, целостность и защиту данных. В основу разработки концептуальной модели данных или модели предметной области была положена реляционная модель данных. Реляционная модель данных (РМД) – логическая модель данных, в которой для хранения данных об объектах предметной области и для воссоздания взаимосвязей между ними используется набор таблиц. Термин «реляционный» означает, что теория основана на математическом понятии «отношение». Часто понятие «отношение» заменяют словом таблица. «Таблица» является нестрогим понятием и часто обозначает не «отношение», как абстрактное понятие, а визуальное представление отношения на бумаге или экране. Следует также помнить, что РМД является логической моделью, то есть отношения являются логическими(абстрактными), а не физическими (хранимыми) структурами. Базовая таблица – таблица, которая включает в себя один или несколько атрибутов объекта предметной области, а также содержит первичный ключ. В данной базе данных (далее БД) объекты предметной области представлены 4-мя базовыми таблицами: - Shipping (табл. 2.1); - Transportations (табл. 2.2); - Ships (табл. 2.3); - Ports (табл. 2.4). Таблица 2.1 – Пароходства
Таблица 2.2 – Перевозки
Таблица 2.3 – Судна
Таблица 2.4 – Порты
Таблица-справочник – таблица, состоящая из первичного ключа, а также атрибута, значение которого будет многократно повторяться в какой-либо базовой таблице. Эти таблицы необходимы для уменьшения избыточности данных. Избыточность — термин из теории информации, означающий превышение количества информации, используемой для передачи или хранения сообщения, над его информационной энтропией. В данной системе разработаны такие таблицы-справочники: - Cities (табл. 2.5); - Shipping_type (табл. 2.6); - Property_type (табл. 2.7); - Transportation_type (табл. 2.8); - Ship_type (табл. 2.9);
Таблица 2.5 – Города
Таблица 2.6 – Тип_пароходства
Таблица 2.7 – Тип_собственности
Таблица 2.8 – Тип_перевозки
Таблица 2.9 – Тип_судна
На основе разработанных таблиц была спроектирована схема данных, которая и представляет собой концептуальную модель данных. Схема данных представлена на рис. 2.1.
Рисунок 2.1. – схема данных
2.2. Создание таблиц, доменов, индексов. 2.2.1. Создание доменов В добавление к явному определению типа данных столбцов, InterBase обеспечивает глобальные определения столбцов или домены (domains), на которых могут базироваться определения столбцов. Домен содержит информацию о тип данных, устанавливает атрибуты и ограничения целостности столбцов. В последующем при создании таблиц возможно использовать домены для определения столбцов. Инструкция CREATE DOMAIN создает наследуемое определение столбца, оно используется как шаблон при определении столбцов в инструкциях CREATE TABLE или ALTER TABLE. Определение домена содержит установки характеристик, которые включают: - Тип данных. - Факультативно значение по умолчанию. - Факультативно недопустимость значения NULL. - Факультативно CHECK ограничения. - Факультативно порядок сортировки. CHECK ограничения в определении домена устанавливают <dom_search_condition>, которые должны быть истины для данных введенных в столбецы, базирующиеся на домене. CHECK ограничения не могут ссылаться на любой домен или столбец.
Синтаксис команды CREATE DOMAIN CREATE DOMAIN domain [AS] <datatype> [DEFAULT {literal | NULL | USER}] [NOT NULL] [CHECK (<dom_search_condition>)] [COLLATE collation];
На рисунке 2.2 содержатся домены: - DNDB – для хранения даты; - DNNUM – для хранения числовых значений; - DNTITLE – для хранения текстовых полей.
Рисунок 2.2 – домены для базы данных «Пароходства Украины»
2.2.2. Создание таблиц CREATE TABLE устанавливает новую таблицу, ее столбцы и ограничения целостности в существующей базе данных. Пользователь, который создает таблицу, становится владельцем таблицы и получает полные привилегии для этого, включая возможность предоставления (GRANT) привилегий другим пользователям, триггерам, и сохраненным процедурам. CREATE TABLE поддерживает несколько опций для определения столбцов: Локальные столбцы определяющие имя и тип данных для данных введенных в столбец. Вычисляемые столбцы, базирующиеся на расширении. Значение столбца вычисляется каждый раз при доступе к таблице. Если тип данных не определен, InterBase вычисляет как соответствующий. Столбцы, к которым обращается выражение, должны существовать раньше, чем столбец может быть определен. Основанные на доменах столбцы, наследуемые все характеристики домена, но определение столбца может включать новое значение по умолчанию, атрибут NOT NULL, дополнительные ограничения CHECK или переопределять порядок сортировки, которые отменяют определение домена. Описание типа данных для столбца типа CHAR, VARCHAR или BLOB-техт может включать предложение CHARACTER SET определяя специфическую кодировку для одиночного столбца. Иначе столбец использует определенную по умолчанию для базы данных кодировку. Если кодировка базы данных изменена, все столбцы впоследствии определенные имеют новую кодировку, но существующие столбцы не изменяются. Предложение COLLATE позволяет указать специфический порядок сортировки для типов данных CHAR, VARCAHR и BLOB-текст. Выбор порядка сортировки ограничен теми которые поддерживаются для данной кодировки столбца, это или кодировка по умолчанию для базы данных в целом или другая установленная в предложении CHARACTER SET как часть определения типа данных. Смотри Language Reference, чтобы получить полный список возможных сортировок. Атрибут NOT NULL предотвращает ввод NULL или неизвестного значения в столбец. Атрибут NOT NULL проявляется во всех INSERT и UPDATE операциях над столбцом. Ограничения целостности могут быть определены для таблицы, когда она создана. Ограничения целостности это правила, которые контролируют базу данных и ее компоненты, связи типа столбец-таблица и таблица-таблица, и проверку вводимых данных. Они охватывают все транзакции к базе данных и автоматически поддерживаются системой. CREATE TABLE может создавать следующие типы ограничений целостности: PRIMARY KEY (первичный ключ) - уникально идентифицирует каждую строку таблицы. Значение в этом столбце либо в упорядоченном наборе столбцов не могут повторятся в более чем одной строке. Столбец PRIMARY KEY должен быть определен только с атрибутом NOT NULL. Таблица может иметь только один PRIMARY KEY, который может быть определен на одном или более столбцов. UNIQUE (уникальные) ключи гарантируют, что не существует двух строк имеющих одно и тоже значение в специфическом столбце или упорядоченном наборе столбцов. Уникальный столбец должен быть определен с атрибутом NOT NULL. Таблица может иметь один или более UNIQUE ключей. UNIQUE ключ может быть использован как FOREIGN KEY (внешний ключ) в другой таблице. Справочные ограничения гарантируют, что значения в наборе столбцов, которые определены в FOREIGN KEY принимают те же самые значения, которые присутствуют в столбце UNIQUE или PRIMARY KEY в справочной таблице. CHECK ограничения предписывают <search_condition>, которые должны принимать значение истинно для добавленных или измененных данных. <search_condition> могут требовать некоторой комбинации или порядка значений или равенства значению, введенному в другие столбцы. Для не именованных ограничений, система создает уникальное имя сохраненное в системной таблице RDB$RELATION_CONSTRAINTS. Ограничения не допустимы на выражениях! Синтаксис команды CREATE TABLE CREATE TABLE table [EXTERNAL [FILE] " <filespec> "] (<col_def> [, <col_def> | <tconstraint>...]);
<col_def> = col {datatype | COMPUTED [BY] (<expr>) | domain } [DEFAULT { literal | NULL | USER}] [NOT NULL] [ <col_constraint> ] [COLLATE collation ]
На рисунке 2.3 содержатся таблицы базы данных «Пароходства Украины»:
Рисунок 2.3 – Таблицы базы данных «Пароходства Украины»
2.2.3. Создание индексов Индексы это механизм для улучшения быстродействия поиска данных. Индекс определяет столбцы которые могут быть использованы для эффективного поиска и сортировки в таблице. InterBase автоматически определят уникальные индексы для первичных и внешних ключей таблицы. Синтаксис команды CREATE INDEX CREATE [UNIQUE] [ASC[ENDING] | DESC[ENDING]]INDEX index ON table (col [, col...]);
На рисунках 2.4 и 2.5 содержатся все индексы базы данных.
Рисунок 2.4 – индексы базы данных «Пароходства Украины»
Рисунок 2.5 – индексы базы данных «Пароходства Украины»
2.3. Разработка триггеров Триггеры это отдельная программа, ассоциированная с таблицей или видом, которая автоматически выполняет действия при добавлении, изменении или удалении строки в таблице или виде. Триггеры могут обеспечивать следующие возможности: - Автоматическое ограничение ввода данных, что бы гарантировать, что пользователь ввел только допустимые значения в поля столбцов. - Упрощение сопровождения приложений, так как изменение в триггере автоматически отражается во всех приложения, которые используют таблицы со связанными с ними триггерами. - Автоматическое документирование изменений таблицы. Приложение может управлять логом изменений с помощью триггеров, которые выполняются всякий раз, когда происходит изменение таблицы. Когда триггер вызван, он имеет непосредственный доступ к добавлению, изменению или уничтожению данных. Триггеру могут быть так же доступны данные из других таблиц. Вы можете разрабатывать триггеры для: - Завершения операции, возможно с сообщением об ошибке. - Установки значений в записи к торой вы обращаетесь. - Добавления, изменения или удаления строк в других таблицах. CREATE TRIGGER определяет новый триггер в базе данных. Триггер никогда не вызывается непосредственно. Наоборот, когда приложение или пользователь пытаются выполнить инструкцию INSERT, UPDATE или DELETE над строкой в таблице, любые триггеры связанные с этой таблицей и операцией автоматически выполняются, or fier. Триггер, определенный для UPDATE на не модифицируемых видах fire, даже если никакая модификация не происходит. Триггеры состоят из заголовка и тела. Заголовок триггера содержит: - Имя триггера уникальное внутри базы данных, которое отличает триггер от всех остальных. - Имя таблицы, определяющие таблицу, с которой связан триггер. - Инструкции, которые определяют, когда триггер fires. Тело триггера содержит: - Факультативный список локальных переменных и их типов данных. - Блок инструкций на языке процедур и триггеров InterBase, заключенный между ключевыми словами BEGIN и END. Эти инструкции выполняются, когда триггер fires. Блок может содержать в себе другой блок, так, чтобы могло быть много уровней вложений. Важно: Так как каждая инструкция в теле сохраненной процедуры должна завершатся точкой с запятой, вы должны определить отличный символ для завершения инструкции CREATE TRIGGER в ISQL. Используйте SET TERM пред CREATE PROCEDURE чтобы определить терминатор отличный от точки с запятой. После инструкции CREATE TRIGGER, включите SET TERM, что бы изменить терминатор обратно к точке с запятой. Триггер связан с таблицей. Владелец таблицы и любой пользователь, наделенный привилегиями на таблицу, автоматически имеют права выполнять связанные с ней триггеры. Триггеры могут быть наделены привилегиями на таблицу, точно так же, как пользователи или процедуры могут быть наделены привилегиями. Используйте инструкцию GRANT, но вместо использования TO username, используйте TO TRIGGER trigger_name. Привилегии триггеров могут быть отменены аналогичным использованием REVOKE. Когда пользователь выполняет действия, которые fires триггер, триггер будет иметь привилегии на выполнение этих действий, если одно из следующих условий истино: - Триггер имеет привилегии для этого действия. - Пользователь имеет привилегии для этого действия. Язык процедур и триггеров InterBase это полный язык программирования для сохраненных процедур и триггеров. Он включает: - Инструкции SQL манипулирования данными: INSERT, UPDATE, DELETE и singleton SELECT. - Операторы и выражения SQL, включая UDF's связанные с базой данных и генераторы. - Мощно расширяет SQL, включая инструкции присвоения, control-flow инструкции, контекстные переменные, even-posting инструкции, исключительные ситуации и инструкции обработки ошибок. Синтаксис команды CREATE TRIGGER CREATE TRIGGER name FOR table [ACTIVE | INACTIVE] {BEFORE | AFTER} {DELETE | INSERT | UPDATE} [POSITION number] AS <trigger_body> terminator <trigger_body> = [<variable_declaration_list>] <block> <variable_declaration_list> = DECLARE VARIABLE variable <datatype>; [DECLARE VARIABLE variable <datatype>;...] <block> =BEGIN <compound_statement> [<compound_statement>...]END <compound_statement> = {<block> | statement;} <datatype> = {{SMALLINT | INTEGER | FLOAT | DOUBLE PRECISION} | {DECIMAL | NUMERIC} [(precision [, scale])] | DATE | {CHAR | CHARACTER | CHARACTER VARYING | VARCHAR} [(1...32767)] [CHARACTER SET charname] | {NCHAR | NATIONAL CHARACTER | NATIONAL CHAR} [VARYING] [(1...32767)]}
На рисунке 2.6 содержатся созданные в базе данных триггеры
Рисунок 2.6 – триггеры в базе данных «Пароходства»
2.4. Заполнение записями таблиц баз данных INSERT добавляет одну или более новых строк данных к существующей таблице или виду. INSERT - одна из привилегий базы данных, которая контролируется инструкциями GRANT и REVOKE. Значения вставляются в столбцы строки по порядку их следования, если не задан факультативный список столбцов. Если список столбцов задан на множестве всех доступных столбцов, во все не перечисленные столбцы автоматически втавляется или значение по умолчанию, или NULL. Если факультативный список столбцов упущен, предложение VALUES должно содержать значения для всех столбцов таблицы. Чтобы вставить одну строку данных, должно присутствовать предложение VALUES и содержать определенный список значений. Чтобы вставить несколько строк данных, определите <select_expr>, которое возвращает уже существующие данные из другой таблицы. Выбранные строки должны соответствовать списку столбцов. Синтаксис команды INSERT INSERT INTO <object> [(col [, col...])]{VALUES (<val> [, <val>...]) | <select_expr>}; <object> = tablename | viewname <val> = {<constant> | <expr>| <function> | NULL | USER } [COLLATE collation]
На рисунках 2.7 – 2.17 содержатся заполненные командой INSERT таблицы.
Рисунок 2.7 – Заполненная таблица «Города»
Рисунок 2.8 – Заполненная таблица «Порт»
Рисунок 2.9 – Заполненная таблица «Типы_собственности»
Рисунок 2.10 – Заполненная таблица «Типы_пароходства»
Рисунок 2.11 – Заполненная таблица «Типы_суден»
Рисунок 2.12 – Заполненная таблица «Типы_перевозок»
Рисунок 2.13 – Заполненная таблица «Судна»
Рисунок 2.14 – Заполненная таблица «Судна»
Рисунок 2.15 – Заполненная таблица «Пароходства»
Рисунок 2.16 – Заполненная таблица «Перевозки» Поиск по сайту: |
Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. Студалл.Орг (0.128 сек.) |