Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Access_2007.doc
Скачиваний:
257
Добавлен:
17.03.2015
Размер:
20.6 Mб
Скачать

Часто задаваемый вопрос. Работа со связями "многие-ко-многим"

Какой подход лучше: связующие таблицы или поля с множественными значениями?

Большинство фанатов БД в ближайшие годы будут приверженцами связующим табли­цам. Такие таблицы приняты, укоренились и не скрывают внутреннего функционирова­ния вашей БД. Связующие таблицы особенно удобны, если вы хотите добавить допол­нительную информацию о связи между двумя конкретными таблицами. Предположим, что вы создаете таблицу Students_Classes для учета учебных курсов, которые все сту­денты слушают в популярном учебном заведении. В таблицу Students_Classes можно включить дополнительные поля, такие как EnrollmentDate (дата записи на курс), Соn-firmationLetterSentDate (дата отправки подтверждающего письма) и Prerequi-sitesChecked (необходимые условия приема проверены).

С другой стороны, у связующих таблиц есть недостатки — с ними трудно работать на листе данных. Если в вашей БД применяется связующая таблица Authors_Books, для вставки новой книги в вашу систему придется редактировать, по крайней мере, две таб­лицы. Сначала необходимо вставить запись в таблицу Books. Затем следует открыть таблицу Authors_Books и вставить в нее новую запись, которая свяжет книгу с автором. (Для облегчения этого процесса можно использовать подстановки в таблице Authors_Books, но все равно для этого требуется отдельный шаг.) Если же в таблице Books содержится поле Authors с множественными значениями, можно добавить книгу и присвоить ей авторов за один шаг, что гораздо удобнее.

Если вы решили остановиться на связующих таблицах и хотите облегчить свою жизнь, программа Access предлагает отличное решение. Можно создать настраиваемую форму, умеющую работать сразу с несколькими таблицами. Можно сконструировать форму, позволяющую человеку, работающему с БД, вставлять запись одновременно и в таблицу Books, и в таблицу Authors_Books. И главное — ваша форма может выглядеть так, как будто она использует только одну таблицу. Вы узнаете, как применять этот прием в части IV.

Практическое применение связей

Каждому проектировщику БД необходимо видеть мир как совокупность таблиц и связей. Смышленые разработчики БД могут быстро оценить информацию и увидеть, как она связа­на. Благодаря этой способности они могут создать корректную БД в любой области.

В последующих разделах представлены два сценария, которые могут помочь вам приоб­рести опыт создания более реалистических отношений. Обе БД, используемые в данных сценариях, включены в примеры к данной главе, мы вернемся к ним снова в следующих гла­вах, когда начнем создавать более сложные объекты БД, такие как запросы, отчеты и формы.

Музыкальная школа

Cacophone Studios управляет музыкальной школой среднего размера. Школа предлагает определенный набор курсов и имеет штатное расписание преподавателей, способных вести большинство из них. Есть также довольно длинный список бывших и потенциальных кли­ентов. В прошлом году случилась катастрофа местного масштаба, когда 273 студента были втиснуты на один и тот же курс и им не назначили преподавателя. (Соседний курс из

14 студентов почему-то получил трех преподавателей) Руководители надеются, что про­грамма Access поможет им избежать подобного конфуза в настоящем и будущем.

Подсказка

Хотите поработать с Cacophone Studios? Попытайтесь выделить возможные таблицы и их свя­зи, прежде чем читать дальше.

Определение таблиц

У каждого бизнеса есть особенности, и необходим долгий подробный анализ для создания наилучшей структуры таблиц для Cacophone Studios. Но, даже не имея особенно глубоких знаний, можно выделить несколько наиболее очевидных кандидатов:

  • Teachers — таблица для хранения списка всех преподавателей из штатного расписания, дополненная контактной информацией;

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

  • Classes — таблица для хранения курсов, предлагаемых компанией Cacophone Studios. В эту таблицу следует включить название учебного курса, дату начала и окончания занятий, максимальный номер принятого студента и другую важную информацию.

Примечание

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

Конечно, компании Cacophone Studios очень скоро понадобится гораздо больше таблиц. Но для начала перечисленных таблиц достаточно.

Определение связей

Выделить необходимые связи очень легко. Студенты записываются на курсы. Преподавате­ли ведут курсы. Эта ситуация предполагает две связи: одна между таблицами Students и Classes, а другая между таблицами Teachers и Classes.

Но тут есть одна загвоздка. Компания Cacophone Studios конечно же не хочет мешать одному студенту заниматься на нескольких курсах, поэтому между этими двумя таблицами необходима связь "многие-ко-многим". Несмотря на то, что Cacophone Studios планирует иметь одного преподавателя для ведения каждого курса, но они хотят сохранить возмож­ность кооперации преподавателей для проведения занятий на одном курсе. Следовательно, таблицы Teachers и Classes вовлечены в более сложное отношение "многие-ко-многим". Для поддержки этих двух связей можно создать две связующие таблицы, названные Students_Classes и Teachers_Classes (соответственно).

На рис. 5.18 показана описанная организация таблиц.

Рис. 5.18. Две связи "многие-ко-многим" формируют основу схемы данных БД музыкальной школы Cacophone Studios

Примечание

Каждая запись в таблице Students_Classes представляет сведения о приеме студента на курс. В таблицу можно добавить дополнительные поля, такие как дата записи студента на курс, предложенная вами скидка для принятых студентов, сделавших заказ заранее, и т. д.

Дополнительные подробности

Компания Cacophone Studios начала движение в нужном направлении, но им еще нужно подумать о многом. Прежде всего, каждый раз, когда предлагается курс, необходимо создать отдельную запись в таблице Classes. Это разумный подход, но у него есть потенциальная проблема. Это связано с тем, что когда курс (например, электроакустический в стиле гамелан (Electro-Acoustic Gamelan)) заканчивается, он снова предлагается как новый курс с но­выми студентами. Несмотря на то, что это полностью новый курс, у него есть информация, общая с предыдущим курсом, например, описание, стоимость курса, предъявляемые требо­вания и т. д.

Для учета этой особенности нужно создать еще одну таблицу ClassDescriptions (описа­ния курсов). В записи этой таблицы должна содержаться вся описательная информация о курсе. В записи таблицы Classes представлены сведения об одном предусмотренным распи­санием конкретном учебном курсе. Таким образом, школа может предлагать без помех один и тот же курс многократно.

Для реализации этой части проекта каждая запись таблицы Classes связывается с един­ственной записью таблицы ClassDescriptions. Между этими таблицами существует связь "один-ко-многим" (рис. 5.19).

Компания Cacophone Studios также должна думать о неприятной финансовой стороне вещей. Каждый раз, когда студент записывается на курс, нужно взять с него установленную плату за обучение. А при каждом назначении преподавателя для ведения курса ему нужно своевременно выплачивать зарплату.

Рис. 5.19. Благодаря таблице ClassDescriptions можно использовать одно и то же описание для нескольких курсов, тем самым избегая избыточности данных

Этими подробностями можно заполнить две таблицы: TeacherPayments (плата препода­вателям) и StudentCharges (плата за обучение студентов). Очевидно, что для этих таблиц надо установить связи, но, возможно, не такие, как вы ожидали. Вы можете решить, что запись таблицы StudentCharges следует связать напрямую с записями таблицы Students. Такая связь не лишена смысла, поскольку необходимо знать, кто из студентов заплатил деньги, Но так же важно знать, за что заплачены деньги — за какой именно курс платит сту­дент. Другими словами, каждая запись таблицы StudentCharges должна быть связана и с таблицей Students, и с таблицей Classes.

Однако есть более легкий способ. Вы можете сберечь силы, связав таблицу StudentCharges непосредственно с таблицей StudentsClasses. Если помните, в каждой записи таблицы Students_Classes содержатся сведения о студентах и курсе для одного учебного курса. Каждый раз, когда добавляется запись в таблицу Students_Classes, необходимо включить соответствующую сумму в таблицу StudentCharges, Аналогичное отношение су­ществует между таблицами Teachers_Classes и TeacherPayments. На рис. 5.20 показано все сооружение (не включена только таблица ClassDescriptions, представленная на рис. 5.19).

Примечание

Напоминаю, что для создания отношения "один-к-одному" следует использовать первичный ключ или индекс, не допускающий совпадений (см.' разд. "Предотвращение дублирования зна­чений с помощью индексов" главы 4). В данном примере нужно создать не допускающий сов­падений индекс для поля Student_ClasseslD в таблице StudentCharges и поля Teacher_ClasseslD в таблице TeacherPayments. Этот индекс гарантирует, что студенты за­платят только один раз за каждый выбранный ими курс, а преподаватели получат зарплату только один раз за каждый курс, который они провели.

Эта БД очень быстро станет достаточно сложной. А компания Cacophone Studios, воз­можно, все еще не закончила ее формирование. (Например, очень вероятно, что ей понадо­бится таблица о платежах студентов.) Как и в большинстве реальных БД, вы будете про­должать добавлять новые таблицы и связи бесконечно.

Рис. 5.20. Каждый назначенный курс приводит к появлению платежа в таблице TeacherPayments (вверху слева). Каждый прием студента в курс формирует запись об оплате в таблице StudentCharges (вверху справа). Несмотря на то, что на первый взгляд эта картинка слегка устрашающая, вы должны уметь прокладывать путь последовательно через все таблицы и связи. Начинать создание БД легче всего с нескольких таблиц, постепенно добавляя новые

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]