Проектирование структуры базы данных. Нормализация таблиц
Лабораторная работа, 29 Октября 2012, автор: пользователь скрыл имя
Описание
Цель работы: познакомить с понятием "концептуальная модель"; научиться правильно использовать принципы нормализации при проектиировании базы данных.
Постановка задачи
Пусть некоторая риелтерская контора "Аренда Minus" специализируется на заключении договоров аренды жилых помещений. Круг клиентов-арендаторов "Аренда Minus" не стабилен. Необходимо автоматизировать процесс регистрации и хранения договоров аренды.
Работа состоит из 1 файл
лаб по РУБД.doc
— 3.12 Мб (Скачать документ)Аналогично выполнить скрипт tables.sql
Примечание
Команда commit в приведенном скрипте позволяет завершать транзакцию, которую неявно стартует утилита Interactive SQL.
Контрольные задания
- SQL-операторы, создающие и определяющие объекты базы данных, называют операторами DDL (Data Definition Language, язык описания данных). Приведите, используя справочную систему InterBase, синтаксис оператора create table.
- Что означает предложение collate pxw_cyrl?
Лабораторная №5, №6
Клиентская часть: размещение не визуальных компонентов, соединение с БД.
Клиентская часть: размещение визуальных компонентов, отображение таблиц.
Цель работы: показать размещение компонент доступа к данным и компоненты отображения данных на листах различных типов приложения; грамотно использовать средства, события и методы компонентов;
- Создание приложения в Delphi с использованием InterBase
Рассмотрим использование компонент для создания простейшего приложения. База Baza.gdb состоит из одной таблицы с полями: Ncar, marka, year, fio.
- Запустите Delphi, создайте приложение и модуль данных. В модуль данных поместите IBDatabase1, IBTransaction1, IBTable1, DataSource1.
Для удобства работы всем компонентам можно дать соответствующие имена:
IBDatabase1 |
Dcars, |
IBTransaction1 |
Tcars, |
IBTable1 |
cars, |
DataSource |
DScars |
- В Инспекторе Объектов следует изменить свойства компонент – Dscars, cars, Tcars:
Компонента |
Свойство |
Значение |
DScars |
DataSet |
cars |
cars |
Database |
Dcars |
Transaction |
Tcars | |
Tcars |
DefaultDatabase |
Dcars |
- Двойным щелчком по компоненту Dcars вызываем окно Database Component Editor. Нажимаем кнопку Browse и находим папку, где находится созданная база (baza.gdb), открываем ее. Далее делаем все так, как показано ниже на рисунке и нажимаем ОК.
Клиентская часть: размещение
визуальных компонентов,
отображения таблиц.
- На форму поместите DBGrid1, DBNavigator1, BitBtn1 и BitBtn2.
DBGrid1 - таблица для отображения данных базы данных,
DBNavigator1 - навигатор для управления курсором,
BitBtn1 - кнопка для активизации таблицы,
BitBtn2 - кнопка для закрытия приложения.
Компонента |
Свойство |
Значение |
DBGrid1 |
DataSourse |
DM.DScars |
DBNavigator1 |
||
cars |
Active |
True |
DBGrid1 |
Visible |
False |
DBNavigator1 |
Enabled |
False |
В процедуре BitBtn1.Click (кнопка "показать таблицу") напишите:
DBGrid1.Visible:=True;
DBNavigator1.Enabled:=true;
В процедуре BitBtn2.Click (кнопка "закрыть приложение") напишите:
Form1.Close;
- Сохраните проект на диске С:, в папке IB и запустите проект на выполнение.
- При правильной работе программы у вас должно получится приложение, рисунок которого показан ниже:
- При нажатии на кнопку "показать таблицу", приложение должно принять вид:
Контрольное задание:
Создать приложение для базы EXMPL.gdb с использованием модуля данных и компонент для отображения и заполнения таблиц базы.
Лабораторная №7, №8
Запросы на добавление данных.
Запросы на редактирование и удаление данных.
Цель работы: познакомить с принципами формирования и выполнения операторов добавления, редактирования и удаления данных.
- Добавление данных
Используя скрипт insert.sql, добавьте данные в таблицы базы из Exmpl.gdb.
Код скрипта insert.sql
//Добавить,
данные о хозяевах
INSERT INTO Owner VALUES (l, 'Иванов', 'Мира 36');
INSERT INTO Owner VALUES (2, 'Петров', 'Правды 2/36');
INSERT INTO Owner VALUES (3, 'Ивашко', 'Кирова 18');
commit;
//Добавить, данные
о стоимости аренды
INSERT INTO Rent VALUES ('2-к. квартира', 90);
INSERT INTO Rent VALUES ('1-к. квартира', 60);
INSERT INTO Rent VALUES ('дом', 1800);
commit;
//Добавить,
данные о местоположении
INSERT INTO Realty VALUES ('Кирова 118/2', '1-к. квартира');
INSERT INTO Realty VALUES ('Металлургов 56', 'дом');
INSERT INTO Realty VALUES ('Р-Корсакова 32/15', '2-к. квартира');
commit;
//Добавить,
данные о местоположении
INSERT INTO Lease VALUES (l, 'Петров', 'Правды 2/36', 1, 'Р-Корсакова 32/15', '01/01/01');
INSERT INTO Lease VALUES (2, 'Сидоров', 'Курская 18', 2, 'Кирова 118/2', '08/12/1999');
INSERT INTO Lease VALUES (3, 'Иванов', 'Мира 36', 3, 'Металлургов 56', '05/14/О2' ) ;
commit;
- Редактирование данных
- Редактирование данных о владельцах (Owner) и дат заключения договоров (LDate).
Прежде чем редактировать запись, ее следует выбрать. Для этого:
Ход работы:
- Используя приведенный ниже скрипт, создайте немодифицируемый просмотр sv_view__lease:
CREATE VIEW sv_View_Lease(NLease, Tn, Ow, Adr, LDate) AS
SELECT L.NLease, L.Tn, O.Ow, L.Adr, L.LDate
FROM Lease L, Owner 0
WHERE O.Non = L.NOn
- Начните новый Delphi-проект.
- Поместите на форму компоненты TDBNavigator, TButton и TDBGrid
Форма отображения данных договоров
- Присвойте СВОЙСТВУ Name формы значение fmViewLease.
- Создайте модуль данных с именем dmEdit и назначьте свойства компонентов такими, как показано в таблице.
Свойство компонентов модуля данных
Компонент |
Свойство |
Значение |
TDatabase |
AliasName |
clsrvExmpl |
DatabaseName |
Exmpl | |
Name |
dbExmpl | |
Params |
User Name=SYSDBA PASSWORD=masterkey | |
LoginPrompt |
False | |
Connected |
True | |
TQuery |
Name |
quViewLease |
DatabaseName |
Exmpl | |
SQL |
Select * from sv_View_Lease | |
Active |
True | |
TDataSourse |
DataSet |
quViewLease |
Name |
dsViewLease |
- Создайте папку Edit и сохраните в ней модуль данных и форму fmViewLease под именами dmEditU.pas и View.pas, соответственно.
- Добавьте имя модуля данных в секцию implementation модуля View.
- Теперь, когда записи отображены, реализуем их редактирование. Поставьте в соответствие событию btEditclick кнопки Редактировать процедуру:
Код процедуры btEditciick
procedure TfmViewLease.btEditcliick(
var Bookmark: TBookmark;
begin
Bookmark := dmEdit.quViewLease.
// Отобразить модально форму fmEdit
if (fmEdit.ShowModal = mrOK) and
{Если нажата кнопка OK и набор данных quEdLease находится в состоянии dsEdit или dslnsert }
((dmEdit.quEdLease.State = dsEdit) or (dmEdit.quEdLease.State = dslnsert}) then
begin
try
(сохранить
текущее состояние набора
dmEdit.quEdLease.Post;
{Показать текущее состояние набора данных}
dmEdit.quViewLease.Close;
dmEdit.quViewLease.Open;
finally
// Отобразить текущей ту запись, которую отредактировали
dmEdit.quViewLease.
dmEdit.quViewLease.
end;
end
else
dmEdit.quEdLease.Cancel;
end;
Итак, по нажатии кнопки Редактировать модально отображается форма fmEdit. По нажатии кнопки ОК на этой форме сохраняются отредактированные данные набора dmEdit. quEdLease, отображаемые компонентами TDBLookupComboBox и TDBEdit.
Относительно состояний dsEdit и dslnsert следует заметить, что когда приложение открывает набор данных, оно автоматически переводит его в режим dsBrowse. В любое другое состояние набор данных переходит из состояния Browse. Например, вызов методов INSERT или APPEND для набора данных изменяет состояние dsBrowse на dslnsert.
Два метода, связанные со всеми наборами данных, могут возвращать набор данных в состояние dsBrowse. Cancel заканчивает текущее действие и всегда возвращает набор данных в режим dsBrowse. Post пытается записывать изменения в таблицу базы данных и, при положительном исходе, также возвращает набор данных в режим dsBrowse. Если Post терпит неудачу, то текущее состояние остается прежним.
Диаграмма, приведенная на рисунке, иллюстрирует состояния набора данных и методы, которые инициируют их изменения. Описания состояний наборов данных приведены в таблице.
Значение |
Состояние |
Описание |
DsInactive |
Inactive |
Набор данных закрыт. Данные не доступны |
DsBrowse |
Browse |
Набор открыт. Можно просматривать записи. |
DsEdit |
Edit |
Текущую запись можно редактировать |
dsInsert |
Insert |
Позволяет добавлять новые записи. |
- Добавьте к модулю данных компоненты TQuery и TDataSource.
- Назначьте значения их свойств.
Компонент |
Свойство |
Значение |
TQuery |
Name |
quEdLease |
DatabaseName |
Exmpl | |
DataSource |
dsViewLease | |
SQL |
SELECT Non, LDate FROM Lease WHERE Nlease=:NLease | |
RequestLive |
True | |
Active |
True | |
TDataSourse |
DataSet |
quEdLease |
Name |
dsEdLease |
Примечание: Как видно из значений свойств компонентов, дата заключения договора — это значение параметра quEdLease. Другими словами, значение поля LDate, отображаемое на форме fmEdit, определяется данными текущей записи набора данных quViewLease.
- Редактирование в договоре фамилии владельца недвижимости.
Здесь есть "маленькая" тонкость. Дело в том, что в наборе quEdLease есть только данные о порядковом номере владельца, который хранится в таблице Lease, а не его фамилии. Но конечный пользователь вашей информационной системы не обязан знать соответствие между номерами и фамилиями владельцев. Поэтому мы должны подменить номер на соответствующую фамилию. И добавим еще одно удобство — редактирование заменой данными таблицы.
Ход работы:
- Добавьте к модулю данных компоненты TQuery и TDataSource.
- Назначьте значения их свойств.
Компонент |
Свойство |
Значение |
TQuery |
Name |
quOwner |
DatabaseName |
Exmpl | |
SQL |
SELECT Non, Ow FROM Owner | |
RequestLive |
True | |
Active |
True | |
TDataSourse |
DataSet |
quOwner |
Name |
dsOwner |
- Определите свойства компонентов формы.
Компонент |
Свойство |
Значение |
TDBLookupComboBox |
DataField |
NOn |
DatabaseSource |
dmEdit.dsEdLease | |
KeyField |
NOn | |
ListField |
Ow | |
ListSource |
dmEdit.dsOwner | |
TDBEdit |
Name |
DBEdit1 |
DataField |
LDate | |
DatabaseSource |
dmEdit.dsEdLease | |
TButton |
Caption |
OK |
ModalResult |
mrOk | |
TButton |
Caption |
Отмена |
ModalResult |
mrCancel |