Борис Пахомов Санкт Петербург бхв петербург 2013 удк 004. 4 Ббк 32. 973. 26018. 2 П
Скачать 17.38 Mb.
|
Dept_Head_Name (Имя руководителя) должен быть удален, т. к. Last_Name Фамилия (Имя, а также Emp_Num (Табельный номер) уже существуют в сущности EMPLOYEE Работники. А для доступа к руководителю подразделения можно воспользоваться табельным номером работника (руководитель в качестве работника имеет свой табельный номер. Посмотрим теперь, как отобразить составленный список в объекты базы данных сущности — в таблицы, а атрибуты — в колонки. Проектирование таблиц В реляционной базе данных объектом, представляющим отдельную сущность, является таблица, которая является двумерной матрицей строки столбцов. Каждый столбец матрицы представляет один атрибут. Каждая строка представляет специфический экземпляр сущности. Например, мы проектируем таблицу Покупатели. В таком случае таблица Покупатели — это сущность, а код покупателя, его адрес, контактный телефон и т. д. являются атрибутами данной сущности. Специфические экземпляры сущности — этой покупатель, й покупатель и т. д. В некоторых СУБД (системах управления базами данных, например MS Access, поставляемой с русским вариантом Windows, таблицы и их атрибуты можно задавать по-русски. В большинстве же СУБД — по-английски. После определения сущностей и атрибутов создается модель, которая служит логическим проектом структуры вашей базы данных. Модель отображает сущности и атрибуты в таблицу, в которой колонки являются детальным описанием сущ- ностей БД. 418 Часть II. Приложения Windows В табл. 12.2 показано, как сущность EMPLOYEE была преобразована из списка в таблицу. Таблица 12.2 . Таблица для сущности EMPLOYEE Emp_Num Last_Name First_Name Dept_Num Job_Code Phone_Num Salary 24 Smith John 100 Eng 4968 64000 48 Carter Catherine 900 Sales 4967 72500 36 Smith Jane 600 Admin 4800 37500 Каждая строка таблицы представляет одного работника. Колонки Emp_Num, Last_Name, First_Name, Dept Num, Job_Code, Phone_Num, Salary представляют атрибуты работника. Когда таблица наполнена данными и строка добавляется к таблице, то каждый элемент строки — это ячейка, в которой сохраняется некая информация (например, "Smith"). Вся строка информации по одному работнику называется просто записью. Колонки таблицы, полученные из атрибутов сущности, называют полями таблицы. Определение неповторяющихся атрибутов Одной из задач проектирования базы данных является обеспечение уникального определения каждого экземпляра сущности, те. необходимо сделать так, чтобы система могла извлечь из таблицы единственную строку. Иными словами, должна быть однозначная идентификация строки таблицы. Одну строку от другой отличают по значениям так называемого первичного ключа. Значения, введенные в колонку первичного ключа или во множество колонок, составляющих первичный ключа он может состоять и из нескольких атрибутов, являются уникальными для каждой строки. Если вы попытаетесь ввести некоторое значение в первичный ключ, которое уже существует в другой строке той же колонки, то система контроля, предусмотренная в БД, прекратит операцию и выдаст ошибку. Например, в приведенной таблице EMPLOYEE поле Emp_Num Табельный номер) является уникальным атрибутом. Такой атрибут может использоваться как идентификатор каждого работника в базе данных (те. каждой строки таблицы. Следовательно, этот реквизит можно взять в качестве первичного ключа данной таблицы. Когда вы выбираете какой-то реквизит на роль первичного ключа, проверьте, действительно ли он уникален, те. не встречается ли более одного раза во всех строках таблицы. Если не существует единственной колонки, обладающей свойством неповторяемости данных в ее строках (это свойство называют еще уникальностью, то разработ- Глава 12. Работа с наборами данных. Общие сведения о базах данных чику таблицы самому следует определить первичный ключ на основе двух и более колонок, которые вместе дают требуемую однозначность. Нужно просто подобрать такие поля. При задании таблицы обычно такие атрибуты помечаются, а физически при образовании ключа) они сцепляются друг с другом, обеспечивая свою уникальность для каждой строки таблицы. Вместе с первичным ключом таблицы (primary key) существует итак называемый уникальный ключ (unique key). Уникальный ключ — это не идентификатор строки, каким является первичный ключ. Основная цель уникального ключа — обеспечение ввода в колонку, названную уникальным ключом, уникального значения. У таблицы может быть только один первичный ключи любое количество уникальных. Первичный и уникальный ключи задаются при создании таблицы, когда соответствующие поля относят к первичному ключу или к уникальному. Если поле помечено как уникальное, тов него для каждой строки можно вводить только различные данные. Если в некоторую строку данного поля ввести значение, которое уже встречалось в какой-либо другой строке, то система выдаст сообщение об ошибке. Так должна работать любая БД. Набор правил при разработке таблицы При создании базы данных требуется разработать набор правил для каждой таблицы и колонок. Правила устанавливают и обеспечивают целостность данных (связанные данные должны и модифицироваться, и удаляться совместно. Определение ограничений на целостность данных Ограничения на целостность данных — это правила, управляющие связями "колонка таблица" и "таблица—таблица", а также учитывающие проверку данных на достоверность. Эти правила должны охватывать все транзакции, которые имеют доступ к БД и автоматически поддерживаются системой. Транзакция — это совокупность операций, обеспечивающих завершенность некоторого действия. Например, с вашего компьютера, установленного в банке, подана команда "Перечислить такую-то сумму с такого-то счета насчет такого-то клиента. Операция (в данном случае это транзакция) будет считаться завершенной, если все детали будут выполнены, и до окончания перечисления не произойдет ни отказа компьютера, ни чего-либо другого, помешавшего завершению перечисления. Ограничения на целостность данных могут быть применены как в целом к таблице, таки к отдельной колонке. Мы уже знаем ограничения, налагаемые на первичный или уникальный ключ (по их определению) гарантируют, что любые два значения в колонке или в наборе колонок не будут совпадать. Значения данных, которые однозначно определяют строки (первичный ключ) водной таблице, могут появляться в других таблицах. В этой связи вводится понятие внешнего ключа (foreign key). Внешний ключ — это колонка или набор колонок 420 Часть II. Приложения Windows таблицы, которые содержат значения, совпадающие с первичным ключом в другой таблице. Принудительное обеспечение целостности данных При задании внешнего ключа необходимо быть уверенным, что станет поддерживаться целостность данных, когда более одной таблицы ссылаются на одни и те же данные. Строки одной таблицы всегда должны соответствовать строкам таблиц, ссылающихся на эту таблицу. Например, вы обрабатываете движение товаров на складе. В вашей БД имеются таблицы Поставщики и Покупатели, содержащие коды товаров, а также таблица Ценник (сегодня модно давать ей название Прайс-лист), в которой имеются характеристики товаров (цена, единица измерения и т. п. Все три таблицы связаны между собой кодом товара. И, например, неаккуратное изменение какой-либо строки в таблице Ценник может разрушить данные в остальных таблицах. Поддержание режима целостности данных обеспечивает их нормальное функционирование. Поэтому в программном обеспечении баз данных предусматривают возможность принудительного обеспечения ссылочной целостности с помощью задания внешнего ключа. Но прежде чем задать внешний ключ, необходимо определить уникальный и первичные ключи, на которые ссылается этот внешний ключ. Тогда, если информацию изменить водном месте, она автоматически будет соответственно изменена и во всех остальных местах, в которых уже существует. Выбор индексов Индекс (указатель) — это механизм, используемый для ускорения извлечения записей таблицы в ответ на некоторый запрос при определенных условиях поиска. Это как поиск по указателю в книге индекс (указатель) содержит номера страниц, связанных сданным термином, что позволяет быстро найти нужную страницу. Индекс базы данных служит логическим указателем на физическое размещение адрес) строки в таблице. Индекс хранит каждое значение колонки, по которой предполагается вести поиск в таблице, или значения колонок с указателями на все дисковые блоки, содержащие строки с таким значением. Извлечение данных является быстрым, потому что значения индекса упорядочены и сами они относительно невелики. Это позволяет системе быстро отыскивать ключевые значения. Как только в индексе ключевое значение найдено, система выбирает связанный с этим значением указатель на физическое размещение данного, которое ищется. Использование индексов требует меньшего количества страниц выборки, чем последовательный просмотр каждой строки таблицы. Индекс может быть определенна одной или нескольких колонках таблицы. Язык Каждая система управления реляционной БД предусматривает применение специального языка структурированных запросов SQL (Structured Query Language), при Глава 12. Работа с наборами данных. Общие сведения о базах данных чем используется не весь языка некоторое его подмножество. Например, Microsoft SQL Server использует вариант SQL, названный Transact-SQL, который, по мнению разработчиков этого продукта, наиболее подходит для созданной ими структуры БД. На языке SQL создаются элементы БД (структуры таблиц, хранимые процедуры и т. д. На этом же языке пишутся запросы к БД на выборку или модификацию информации. Мы дадим лишь основные сведения о наиболее часто употребляемых операторах этого языка, потому что на их использовании построена работа с наборами данных. Работа с наборами данных построена на принципе "запрос—ответ", а запросы формируются на языке SQL. Правда, среда программирования предоставляет возможность определенной автоматизации этого процесса, однако без понимания сути дела пользоваться услугами этой среды довольно затруднительно, ибо часто приходится самому вмешиваться в процесс построения запросов. Наиболее часто используемые операторы SQL приведены в табл. 12.3. Таблица Наиболее используемые операторы Оператор Краткая суть SELECT_,_приведем_сокращенный_синтаксис_этого_оператора_SELECT__{*_|_[,_...]}__[INTO'>SELECT Сего помощью выбирают из таблиц БД определенные столбцы Это элемент оператора, в котором задаются ограничения на выборку данных BY Это элемент оператора, в котором задаются сведения об упорядочении выборки по тем или иным полям, он обеспечивает сортировку данных как по возрастанию, таки по убыванию значений отдельных полей Добавляет записи к таблице Удаляет записи из таблицы Модифицирует отдельные поля записи Чтобы иметь некоторое представление, например, об операторе SELECT , приведем сокращенный синтаксис этого оператора SELECT {* | [INTO :var [, :var ...]] FROM [WHERE [ORDER BY INTO — содержит список переменных ( var ), в которых станут запоминаться извлекаемые поля таблиц FROM — в этом элементе перечисляются таблицы, из которых будет происходить выборка 422 Часть II. Приложения Windows Form WHERE — этот элемент задает условия поиска данных ORDER BY — задает сортировку возвращаемых строк (по возрастанию или убыванию значений полей таблицы — некоторое выражение. Например, можно записать оператор SELECT в таком виде SELECT Salary * 0.13 from Employee (что означает выбрать из таблицы Employee столбец Salary , умноженный на 0.13 ). Результатом будет столбец суммы налога по каждому работнику. Salary * 0.13 — это и есть выражение | SUM ([ALL] | AVG ([ALL] | MAX ([ALL] | MIN ([ALL] | CAST ( | UPPER (это список функций, которые могут участвовать в операторе SELECT — это имена таблиц, из которых происходит выборка — это условия отбора данных в выборку | | | | | | | {ALL | SOME | ANY} ( SELECT SELECT JOB_GRADE, JOB_CODE, JOB_COUNTRY, MAX_SALARY FROM Этот оператор выбирает из таблицы PROJECT четыре поля (те. все строки по этим полям. А куда, кстати, поместятся результаты выборки Они будут в том объекте, который этот запрос выполняет у такого компонента имеется командная строка (Command Text), где и должен находиться текст оператора выборки. Компонент выполнит этот оператора результат либо поместит в своем буфере, откуда его надо будет извлекать, либо передаст другому компоненту, с которым он связан. Все зависит оттого, как построена среда программирования. В нашем случае будет иметь место последнее утверждение к каждой таблице подключается такой компонент (он называется Table Adapter ), который формирует запрос на выборку, выполняет эту выборку и передает ее результаты в связанную с ним таблицу. Глава 12. Работа с наборами данных. Общие сведения о базах данных SELECT * FROM В этом операторе выбираются все строки из таблицы с именем COUNTRIES EXEC SQL SELECT COUNT (*) INTO :cnt FROM COUNTRY WHERE POPULATION > Этот оператор использует при выборке функцию для подсчета всех строк в таблице. Поиск должен удовлетворять условию, определенному в элементе нужно выбрать из таблицы COUNTRY те записи, в которых значение поля POPULATION больше 5 000 000). SELECT CITY, STATE FROM CITIES ORDER BY Этот оператор извлекает из таблицы CITIES два столбца CITY и STATE , а также упорядочивает строки по значению столбца И еще об одном надо сказать в данной среде программирования общение с базами данных происходит по так называемой технологии, когда, чтобы добраться до соответствующей БД, формируется специальная строка, называемая строкой соединения с БД (Connecting String). Она формируется с помощью средств самой среды через диалоговые окна общения с пользователем. Среда Visual C++ 2008 позволяет подсоединяться к двум типам баз данных базам данных типа MS Access и базам данных типа MS SQL Server. Сточки зрения технологии работы сними, эти БД между собой ничем не отличаются. В момент формирования строки соединения следует просто выбрать из двух вариантов. Наборы данных (компонент DataSet) В настоящей версии работа с наборами данных отключена. Здесь приводится работа с наборами данных для версии 2005 г (см. пояснение во введении. Наборы данных (НД) — это такие объекты DataSet (в нашем случае это компонент палитры компонентов, через которые происходит подключение приложения к базам данных. При этом информация из БД загружается в НД, который затем станет обеспечивать данными ваше приложение из локальной кэш-памяти. С таким НД можно работать даже тогда, когда ваше приложение отсоединено от базы данных. НД поддерживает информацию об изменениях таким образом, что обновленные данные могут быть снова отосланы БД, когда ваше приложение подсоединится к ней. Короче говоря, НД — это такой компонент, через который осуществляется связь приложения с выбранной (вовремя установления этой связи) БД соответствующего типа. Наборы данных, предусмотренные в данной версии среды программирования обозначаются как typed и untyped . Работа с первым типом в данной версии отключена, хотя и осталась возможность встретиться с этим наименованием присоединении с базами данных. Это так называемые НД со схемами. Второй тип НД — без схем. НД со схемами предназначены для подключения к таблицам баз данных, находя 424 Часть II. Приложения Windows Form щихся вне вашего приложения, те. извне. С помощью таких типизированных наборов извлекаются взаимосвязи между таблицами из специальных файлов БД и рисуются их схемы прямо в окне дизайнера набора данных. С использованием такого типа НД легче составлять программы. Нетипизированные наборы данных работают с таблицами, которые строятся вами на этапе дизайна приложения прямо в самом будущем приложении. Эта возможность в данной среде оставлена, что позволяет подсоединяться к внешним базам данных через таблицы, построенные в вашем приложении точно по структуре тех таблиц внешней базы данных, с которыми вы хотите установить связь и их обрабатывать в дальнейшем. Когда вы пытаетесь поместить компонент DataSet в форму (а он находится в группе палитры компонентов, то открывается диалоговое окно для выбора типа НД (рис. 12.1). Рис 12.1. Выбор типа НД Так как выше мы отметили, что работа в данной версии ведется с нетипизирован- ными НД, тов появившемся окне надо выбрать переключатель Untyped dataset. В результате ничего не случится компонент поместится на поддон формы. Останется только его настроить на получение данных из некоторой таблицы базы данных. Сам этот компонент не участвует в подсоединении к базе данных. Он лишь позволяет построить вам у себя таблицу данных по той структуре, какая имеется у таблицы базы данных, к которой вы хотите подсоединиться в вашем приложении. Общая технология организации работы с базой данных в приложении В дальнейшем мы станем работать с базами данных, средства создания которых у нас всегда под рукой это MS Access, поставляемое вместе с операционной системой. Итак, технология такова. Создается таблица-файл с помощью MS Access. Ее надо достать средствами VC++ 2011. Глава 12. Работа с наборами данных. Общие сведения о базах данных Для этого берется компонент oleDbDataAdapter , который настраивается на доступ к БД. Вы можете не обнаружить некоторые компоненты в списке |