ВУЗ: Не указан

Категория: Не указан

Дисциплина: Не указана

Добавлен: 17.03.2025

Просмотров: 457

Скачиваний: 1

ВНИМАНИЕ! Если данный файл нарушает Ваши авторские права, то обязательно сообщите нам.
  • в обеих таблицах должно быть по меньшей мере одно общее поле;

  • эти поля в обеих таблицах должны иметь одинаковые типы данных и длину (названия могут быть разными);

  • по этим полям обе таблицы должны иметь вторичный индекс (за исключением случая, когда участвующее в соединении поле является ключом);

  • иногда необходимо определить ведущую и ведомую таблицы.

Рассмотрим подробнее последние понятия. Между двумя таблицами могут быть отношения:

  • 1:1 (один к одному): одной записи в первой таблице всегда соответствует одна и только одна запись во второй таблице;

  • 1:М (М:1) (один ко многим, многие к одному): одной записи в первой таблице (эта таблица называется ведущей) может соответствовать несколько записей во второй (ведомой) таблице, но каждой записи во второй таблице соответствует только одна в первой;

  • M:N (многие к многим) одна запись в первой таблице связана со многими записями во второй и наоборот.

Приведенные табл. 1 и 2 относятся ко второму случаю: каждый студент учится по одной специальности, но по каждой специальности учатся много студентов. Поэтому табл. 1 ведущая, табл. 2 ведомая. Графически это обозначают следующим образом:

Специальности  Студенты

Аналогично отношение 1:1 обозначается через , а M:N через . Случай M:N надо рассмотреть отдельно, по умолчанию Delphi (и многие другие СУБД) не разрешают им пользоваться.

Подведем итоги. Для проектирования базы данных необходимо:

  • составить перечень данных, хранение которых необходимо обеспечить;

  • распределить их по файлам;

  • продумать связи между файлами, для каждой связи выполнить приведенные выше требования для соединения;

  • разработать структуру каждого файла.

Оформление структуры файлов показано в предыдущем параграфе, их соединение можно показывать следующим образом:

Имя табл. 1 (имя поля)  Имя табл. 2 (имя поля).

После выполнения этой подготовительной работы можем приступить к реализации.


5.3. Реализация базы данных в Delphi

Базы данных в Delphi реализуют с помощью компоненты Database Desktop. Ее можно вызывать как прямо из Delphi (пункт меню Tools, затем Database Desktop), так и непосредственно из операционной системы. Database Desktop является типичным представителем MDI – приложения: его меню изменяется в зависимости от выполняемой работы. Database Desktop позволяет создать базы данных по форматам данных многих СУБД, мы будем работать с Paradox 7.0 (файлы данных *.db). После вхождения в Database Desktop выбираем из меню File – New – Table. Далее предлагают выбрать СУБД, выберем Paradox 7.0. Откроется таблица для определения структуры первого файла. Если следовать приведенным рекомендациям, то можно получить таблицу следующей структуры (рис. 5.1).

Рис. 5.1. Определение структуры базы данных

Создаем файл DAT1.db. В графу “Field Name” занесем имя поля, нажатием на “Enter” переходим к следующей графе “Type”. Имеется выпадающий перечень типов данных, который появляется при нажатии на клавишу пробел. Лучше не набирать тип данных на клавиатуре, а выбрать из перечня. Длина поля (Size) требуется лишь для данных, имеющих нестандартную длину. В нашем примере – только для символьных строк. Paradox 7.0 допускает использовать в качестве имен полей строки длиной до 25 символов, разрешены и пробелы в именах. Настоятельно не рекомендуется использовать в именах пробелы, потому что это сильно затрудняет обработку файла в некоторых случаях. В правой части экрана имеются поля для уточнения свойств создаваемого файла “Table Properties”. По умолчанию показано свойство “Validity Checks” – допустимые значения:

Required Field – если отметить его, то в этом поле файла всегда должно быть значение, пустое поле не допускается;

Minimum value – можно задать нижнюю границу значения для этого поля;

Maximum value – можно задать верхнюю границу;

Default value – значение по умолчанию: если для многих записей поле имеет постоянное значение, то его занесение в это свойство позволяет уменьшить объем ввода.

Рассмотрим подробнее типы данных в Paradox 7.0.

Alpha – символьные строки длиной 1 – 255 символов, допускают все операции сравнения;

Number – для вещественных чисел;

Short – для целых чисел, длиной 2 байта;

Long Integer – для целых чисел длиной 4 байта;

Logical – аналог типу Boolean в Pascal‘е;

Date – для хранения дат, даты должны быть представлены в формате месяц/день/год, в таком же формате можно задавать минимальные и максимальные значения;


Time – время.

Таким образом, строка за строкой, заполним таблицу, задавая структуру создаваемого файла. Из задач, перечисленных выше, остались нерассмотренными две: определение ключа и вторичного индекса. Для определения ключа достаточно поставить * в колонку Key в строке(ах) ключевого поля. Для создания вторичного индекса обратимся к свойствам таблицы. Из перечня возможных свойств выбираем Secondary Indexes (вторичный индекс). Нажмем на кнопку Define. В ответ откроется перечень полей данного файла, из которых и выбираем поле (поля) для вторичного индекса. В нашем примере ограничимся индексацией по полю SPEC. Database Desktop спросит еще имя индекса, желательны имена следующего вида имя_поля_IND, что позволяет легко отличить имена индексов от других.

После завершения формирования структуры файла необходимо его сначала сохранить, после этого можно начинать ввод и редактирование данных. Чтобы облегчить сохранение и повторное открытие файлов данных целесообразно сначала определить рабочий и личный директории: это делается путем выбора из пункта меню File пунктов Working Directory и Private Directory. При нажатии на традиционную кнопку Save As откроется знакомое диалоговое окно Windows для сохранения. Для ввода и редактирования данных надо нажать на клавишу F9 или выбрать из меню Table пункт Edit Data. Если необходимо внести изменения в структуру файла (в том числе изменить границы допустимых значений или индексы), то выберите из меню Table пункт Restructure. Для ввода данных откроется таблица определенной нами структуры и можно начинать ввод и редактирование данных. При попытке ввести в какое-то поле значение, которое не принадлежит области допустимых значений, оно просто не будет принято, специальное предупреждение при этом не выдается. После завершения ввода (редактирования) закроем файл. Обратим внимание на то, что один и тот же файл не может быть одновременно открыт в Database Desktop и Delphi.

Создадим второй файл DAT2.db со следующей структуры

Содержание поля

Имя поля

Тип данных,

длина

Диапазон значений

Индексы

1

Номер

специальности

SPEC

Короткое целое – 2

Ключ

2

Название специальности

NAZV_SPEC

Символ – 18


Объединим таблицы по полю SPEC. Условия для соединения выполнены: данные в полях обеих таблиц имеют одинаковый тип и длину, в таблице DAT1.db имеется вторичный индекс по этому полю, в DAT2.db это поле ключевое. Соединение файлов можно выполнять как в Database Desktop, так и в Delphi во время разработки приложений (вторичный индекс обязателен). Более предпочтительным является второй вариант – он обладает большей гибкостью, особенно если файлов много и их можно по-разному объединить. Созданные при проектировании базы данных соединения не могут быть пересмотрены во время разработки приложений. Напомним, что до выполнения соединения надо определить характер отношения между участвующими полями (1:1; 1:M или N:M). При (1:1) соединение симметричное и неважно, из какого файла его создавать. При (1:M) необходимо соединение выполнять из файла детализации, отношение (N:M) не допускается, оно должно предварительно быть сведено к (1:M).

Для соединения в Database Desktop откроем файл детализации (в нашем случае DAT1.db), главный файл (DAT2.db) не должен быть в это время открыт. Войдем в режим реструктуризации, из списка свойств файла выберем Referential Integrity, затем Define и пред нами откроется таблица установления соединения: в левом столбце перечислены поля файла DAT1, а в правом – перечень файлов из рабочего директория. Выберем сначала поле из левого столбца, а затем имя файла из правого. Получим соединение между выделенным полем и ключевым полем файла. Другие виды соединений (по индексированным неключевым полям) в этом режиме не предусмотрены. Соединение завершается присвоением ему имени и сохранением.


5.4. Обработка файлов

В Delphi имеется три уровня доступа и обработки файлов:

  • использование стандартных средств;

  • использование языка SQL;

  • программируемый доступ к базе данных: использование языка Object Pascal для написания программ обработки данных.

Первый уровень наиболее легкий в реализации, но с наименьшими возможностями, второй – позволяет к возможностям Delphi добавить средства SQL, что особенно удобно при выполнении задач поискового характера, использование Object Pascal дает возможность реализовать алгоритмы любой сложности, используя в качестве исходных данные из базы. Кроме того, среди стандартных средств можно отдельно выделить мастера (Wizard), с помощью которого представление данных из баз данных на экране предельно просто. Для запуска мастера необходимо выбрать в меню Delphi пункт Database и подпункт Form Wizard. Далее следуют подробные подсказки по составлению форм. В случае необходимости это средство каждый студент может освоить самостоятельно.

5.4.1. Представление данных в виде таблиц

Поставим перед собой задачу: построить приложение для просмотра одного файла (DAT1) в виде таблицы и формы. Для этого откроем новое приложение и перенесем на главную форму:

  • из палитры Data Access Table и DataSource;

  • из палитры Data Control DBGrid.

Table и DataSource являются невизуальными т.е. во время работы приложения они не будут показаны на экране, поэтому их местоположение не имеет значения, обычно их располагают рядом с той таблицей, к которой они относятся. DBGrid визуальная компонента.

Необходимые свойства Table (обращаем внимание на то, что в данном случае свойствам необходимо присваивать значения именно в такой последовательности):

  1. DataBaseName задается путь до того директория, где размещен файл;

  2. TableName – имя файла, если предыдущему свойству присвоено правильное значение, то можно это имя выбрать из выпадающего списка, одновременно можно таким образом проверить, правильно ли задан путь (появится нужный список файлов или нет);

  3. Active – дать значение True.

Необходимые свойство DataSource:

DataSet, значение Table1, что является именем по умолчанию объекта Table, можно его выбрать из списка.

Необходимое свойство DBGrid – DataSet; значение DataSource1 (имя по умолчанию объекта DataSource, можно выбрать из списка.

После всех этих операций в таблице должны появиться данные из выбранного файла, на DBGrid имеются полосы скроллинга, позволяющие просматривать весь файл. В качестве имен полей используются внутренние имена полей файла. Такой способ задания полей при просмотре файла называется динамическим, при изменении структуры файла эти изменения автоматически будут отражены на экране просмотра. Обращаем внимание на свойство IndexName объекта Table. По умолчанию оно не определено. Если обрабатываемый файл имеет вторичные индексы (созданные в Database Desktop), то имя любого из них можно выбрать из выпадающего списка и задать в качестве значения IndexName. Результат: если имя индекса не задано, то данные в таблице упорядочены по возрастанию ключей, если задано имя индекса – то по возрастанию значений в поле индекса. Вывод: вторичные индексы позволяют представить одни и те же данные упорядоченными по разным критериям. Обращаем внимание на то, что когда файл связан с таблицей на экране (свойство Active имеет значение True), то никакие изменения не будут иметь значения. Для изменения имени индекса надо сначала менять значение на False, произвести необходимые изменения, а затем восстановить значение True.