Технология управления данными
Советы для начинающих программистов
Как проектировать реляционную базу данных
Алан Шварц
Почему используется реляционная база данных? Пусть вам необходимо
срество для отслеживания уплаты ренты. Если вы разложите данные по
пользователям, операциям и средствам в одну таблицу, это причинит Вам
немало хлопот. Суммирование значений по каждому покупателю и каждому
виду платежа включает все новый и новый ввод данных, что вызывает неп-
роизводительную трату времени и дисковой памяти. Помимо этого, одна
таблица не оставляет места человеческой ошибке - если инициалы пользо-
вателя введены однажды, но не при последующих обращениях, вы не сможе-
те сгенерировать точные отчеты. И если вы произведете сложение рабочих
полей по каждой операции, вы столкнетесь с трудностями при документи-
ровании. Решение заключается в хранении информации о пользователях,
операций и результатов в отдельных таблицах и установлении связей меж-
ду ними.
Когда две таблицы имеют реляционную связь, перемещение по записям
одной таблицы (порождающей) влечет за собой соответствующее перемеще-
ние по записям в другой (порождаемой). То есть, пока вы работаете с
отдельной операцией, текущая запись в таблице пользователей будет пос-
тоянно содержать данные по пользователю этой операции. Реляционная
связь требует, чтобы две таблицы имели часть общих данных - обычно,
хотя и не обязательно - одно поле.
В DBASE, где каждая таблица - собственный файл данных, вы могли
бы назвать таблицы CUSTOMER.DBF, TRANS.DBF и PRODUCT.DBF. Перед уста-
новлением связи порождаемый файл должен быть проиндексирован по тому
полю, по которому он связан с порождающим. Затем использованием коман-
ды SET RELATION устанавливается текущая связь. Например, для построе-
ния связи от TRANS.DBF к CUSTOMER.DBF вам следовало бы вводить коман-
ды, подобные следующим, полагая, что оба файла данных имеют идентичные
поля под названием CustID:
SELECT 1
USE Customer INDEX CustID
SELECT 2
USE Trans INDEX Transcust,Transprod
SET RELATION TO CustID INTO Customer
РАЗУМНОЕ ПРОЕКТИРОВАНИЕ ОЗНАЧАЕТ МОЩНОСТЬ БАЗЫ ДАННЫХ
г==========¬ г==========¬ г==========¬ г=========¬
¦ ¦ ¦ ¦ ¦ ¦ ¦ ¦
¦ TRANS ¦ ¦ CUSTOMER ¦ ¦ TRANS ¦ ¦ PRODUCT ¦
¦==========¦ ¦==========¦ ¦==========¦ ¦=========¦
¦ ¦ ¦Идентифи- ¦ ¦Идентифи- ¦ ¦Идентифи-¦
¦ Операция ¦ ¦катор поль¦<------¦катор поль¦ -->¦катор про¦
L==========- ¦зователя ¦ ¦зователя ¦ ¦ ¦дукции ¦
-----------¬ ¦==========¦ ¦==========¦ ¦ ¦=========¦
¦ Имя ¦ ¦ ¦ ¦Идентифи- ¦ ¦ ¦ ¦
+----------+ ¦ Имя ¦ ¦катор про-¦--- ¦ Описание¦
¦ ¦ ¦==========¦ ¦дукции ¦ ¦=========¦
¦Адрес и др¦ ¦ ¦ ¦==========¦ ¦ ¦
L----------- ¦Адрес и др¦ ¦Дата опе- ¦ ¦ Катего- ¦
г==========¬ L==========- ¦рации и др¦ ¦ рия и др¦
¦ Продукция¦ L==========- L=========-
L==========-
-----------¬
¦ Описание ¦
+----------+
¦ ¦ ---¬
¦ Категория¦ ¦ ¦ - избыточные данные
L----------- L---
г==========¬
¦Дата опе- ¦
¦рации и др¦
L==========-
Попытка представления всех ваших данных в одной таблице (слева)
приводит к избыточности данных. Лучше сформировать несколько таблиц
для представления данных и использовать указатели отношений для свя-
зи между ними.
--------------------------------------------------------------------
Тогда при любом обращении к другой операции запись текущего поль-
зователя была бы единственной, поле CustID которой идентично полю
CustID текущей операции. Тo ecть, команда:
? CUSTOMER -> Name
возвращает имя пользователя текущей операции. Этот принцип применяется
ко всем действиям с базами данных, включая работу с экранами, списками
и отчетами.
Для полей, используемых для связывания таблиц, не требуются ни
такое же имя, ни 100-процентная идентичность данных. DBASE-операция
EXACT - один из способов проверки того, насколько точно должны соот-
ветствовать поля. При EXACT OFF (oтмена) операция с идентификатором
пользователя "АС-1" могла бы вызвать обращение к пользователю, чей
идентификатор - "АС-12"; при EXACT ON требуется точное соответствие.
Выбор значения ЕXACT ON или OFF зависит от ситуации, но вы всегда дол-
жны знать, какое значение вы присвоили EXACT оператором SET EXACT.
Для того, чтобы учесть имя пользователя и результат каждой опера-
ции, вам необходимо установить отношения между базой данных TRANS и
обоими другими файлами. DBASE III Plus допускает только одно отношение
порождения, но это можно обойти, полагая, что порождающий файл - один,
в то время как на самом деле - другой, как показано ниже:
SELECT 3
USE Product INDEX ProdID
SELECT Customer
SET RELATION TO Trans->ProdID INTO Product
SELECT Trans
SET RELATION TO CustID INTO Customer
Для всех практических применений база данных TRANS является по-
рождающей в обоих отношениях. Но поскольку отношение с PRODUCT уста-
новлено, пока выбрана база CUSTOMER, DBASE позволяет второе отношение
между TRANS и CUSTOMER.
Такая хитрость не является необходимой для DBASE IV, Foxbase,
FoxPro или Clipper. Эти пакеты разрешают множественные отношения, та-
кие как:
SET RELATION TO ProdID INTO Product, TO CustID INTO Customer ,
Это лучшее средство для установления отношений.
Конечно, программисты часто пользуются более чем одним средством
одновременно, требуя установить отношение один-к-многим между TRANS и
PRODUCT. Перенесем, впрочем, эту беседу на другое время.
|