Опубликован: 13.07.2010 | Доступ: свободный | Студентов: 889 / 20 | Оценка: 4.40 / 4.20 | Длительность: 77:34:00
Самостоятельная работа 7:

Создание объектов базы данных SQL Server средствами оболочки VS.NET 2003

Назначение связей между таблицами

Связи позволяют определить зависимости между данными, представленными в разных таблицах базы данных. Например, предположим, что в базе данных имеются таблицы Customers, Orders, OrderDetails, как и базе данных Northwind, используемой нами в качестве образца. Связи между таблицами позволяют, в частности, обеспечивать целостность данных в процессе ввода в базу данных.

В этой части мы посмотрим, как создавать связи между таблицами и как просматривать эти связи с помощью схем баз данных. Для создания связей нужно иметь хотя-бы две талицы. Таблицы, в которых имеются связи данных, называются взаимосвязанными. Во взаимосвязанных таблицах нужно организовать проверку ссылочной целостности, чтобы при изменении данных в одной таблице автоматически обновлялись связанные с ней данные в другой.

Для реализации правил ссылочной целостности необходимо создать связи между таблицами. Примером применения правил ссылочной целостности в базе данных Northwind является то, что при вводе записи в таблицу Orders она должна содержать сведения о заказчике, которые хранятся в таблице Customers. Между этими двумя таблицами установлена связь через поле CustomerID, которое имеется в обеих таблицах.

В таблице Customers поле CustomerID является полем первичного ключа и все значения в нем должны быть уникальными. В таблице Orders поле CustomerID является полем внешнего ключа и указывает на первичный ключ в другой таблице.

Оболочка имеет средство для наглядного графического представления или редактирования связей между таблицами базы данных. Это средство называется схемой базы данных. Ниже приведен снимок схемы для редактирования связей двух таблиц: Customers и Orders


Примечание.На рисунке показан тип связи "один ко многим". В соединительной линии между таблицами со стороны родительской таблицы Customers изображен символ ключа, который обозначает ту сторону связи, в которой используется только одна запись. Со стороны дочерней таблицы Orders на связи изображен символ \infty, обозначающий возможность наличиия многих записей с одним и тем же значением внешнего ключа CustomerID.

Правила ссылочной целостности и связи между таблицами позволяют обеспечить механизм поддержания непротиворечивости данных в разных таблицах, а именно

  1. Предотвратить удаление записи из родительской таблицы (например, из таблицы Customers ) или редактирование поля ключа, если в дочерней таблице (например, Orders ) имеется запись, связанная с этим ключом.
  2. Установить возможность обновления ключа в родительской таблице таким образом, чтобы автоматически обновлялся ключ в дочерней таблице, если в столбце, связывающем эти таблицы, разрешено обновление. Такая операция называется каскадным обновлением.
  3. Обеспечить автоматическое удаление связанных записей в дочерней таблице, если удаляется соответствующая запись в родительской таблице.

Связи между таблицами могут быть трех типов

  1. Связь " один к одному " - каждой записи в родительской таблице соответствует только одна связанная с ней запись в дочерней таблице. Чаще вместо этой связи используют представления (см. ниже).
  2. Связь " один ко многим " - каждой записи в родительской таблице соответствует много записей в дочерней таблице. Такая связь применяется чаще всего.
  3. Связь " многие ко многим " - записи в родительской таблице могут быть связаны со многими записями в дочерней таблице, а записи в дочерней таблице могут относится ко многим записям родительской таблицы.
  • Добавьте к нашей базе данных, где в настоящее время хранится только одна таблица tblCustomers, новую таблицу (с будущим именем tblCustomerPhones ). Для этого выделите в панели Server Explorer узел с именем нашей базы MyBase и через меню оболочки выполните команду Database/New Table.


  • Заполните свойства полей окна дизайнера таблицы следующими значениями
Значения структуры таблицы tblCustomerPhones
Column Name Data Type Length Allow Nulls Identity
PhoneID int 4 Не отмечено 07_48
CustomerID int 4 Не отмечено No
PhoneType nvarchar 50 Не отмечено No
PhoneNumber nvarchar 10 Не отмечено No
  • Определите в качестве столбца первичного ключа поле PhoneID. После этого окно дизайнера таблиц должно выглядеть так


  • Сохраните таблицу под именем tblCustomerPhones


Обратите внимание, что после сохранения таблицы в панели Server Explorer появился узел с нашей таблицей


Эта таблица может содержать данные о телефонных номерах и типах этих номеров (внутренний, городской, междугородний, рабочий, мобильный, домашний), которые может иметь каждый отдельный заказчик. На примере этих двух таблиц продемонстрируем способ задания связи "один ко многим" (один заказчик может имет много телефонов).

  • Щелкните правой кнопкой мыши на узле Database Diagrams в древовидном меню базы данных MyBase в окне Server Explorer и выполните команду контекстного меню New Diagram


  • В появившемся диалоговом окне Add Table выделите обе таблицы (удерживая клавишу Shift)


  • Щелкните на кнопке Add, чтобы ввести эти таблицы в схему, а затем щелкните на кнопке Close. Откроется новая схема базы данных с двумя таблицами


  • Поместите курсор на символ первичного ключа (пиктограмма ключа) в столбце CustomerID таблицы tblCustomers. Удерживая нажатой левую кнопку мыши, перетащите курсор на одноименный столбец CustomerID таблицы tblCustomerPhones и отпустите кнопку. Появится окно Create Relationship (создание отношений), в котором все установки оставьте по умолчанию


После щелчка на кнопке OK на схеме появится созданная нами связь "один ко многим". Еще раз вспомним, что ключ в изображении связи примыкает к родительской таблице с первичным ключом, а символ бесконечности - к дочерней таблице с тем же значением внешнего ключа, которое имеет первичный ключ родительской таблицы.

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


  • Сохраните данную диаграмму, задав ей имя DatabaseDiagram1


Обратите внимание, что в дереве структуры нашей базы на панели Server Explorer появился узел с именем сохраненной диаграммы


Продуманное создание связей в базе данных позволяет обеспечить высокую степень безопасности данных. Необходимо стремиться к тому, чтобы система максимально внимательно следила за корректностью действий пользователя при работе с данными. Если в базе правильно определены связи, то пользователь вынужден вводить в нее информацию в определенном порядке и формате.

В нашей базе, например, пользователь не сможет указать телефон заказчика, пока не введет сведения о самом заказчике. Или, например, если из базы удаляются сведения о заказчике, то система автоматически удалит и все номера телефонов для этого заказчика - зачем хранить номера телефонов, если они никому не принадлежат.