Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Microsoft Office и VBA программирование > Microsoft Office Access
Регистрация

Восстановить пароль

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 09.01.2011, 22:52   #1
Makarus
Пользователь
 
Регистрация: 18.12.2010
Сообщений: 21
По умолчанию Связи Многи-ко-многим

Уважаемые знатоки, помогите, пожалуйста, с реализацией связей в таблицах!
Пытаюсь создать связи многие-ко-многим с использованием связующих таблиц (см. в приложенном файле). Исходя из предметной области ситуация такая: у каждой фирмы может быть несколько адресов ("юридический", фактический и т.д.) и соотв по каждому адресу может находиться неск фирм (то же касается и схемы Фирма-Учредитель). "По книжному", как я понимаю, есть два варианта привязки связующих таблиц (у меня их названия начинаюся с tblCon_):
1 - по полю первичного ключа табл ФИРМЫ и
2 - по соотв индексированным полям в табл ФИРМЫ ("КодАдреса" и "УчредителиФизЛица").
В первом случае, во-первых, - не дает установить такую связь: Relationship must be on the same number of fields with the same data types. (Error 3368); во-вторых, - а корректно ли "вешать" много таких связей (в примере я оставил только две) на один первичный ключ?
Во втором случае пробовал связать по индексированным полям "КодАдреса" и "УчредителиФизЛица": получается. Но как в таком случае "заполнять" связующую таблицу данными - максимально "автоматизированно"??? (А2007, Win7)
Заранее спасибо всем, кто откликнулся...
Вложения
Тип файла: rar многие-ко-многим.rar (29.9 Кб, 28 просмотров)
Makarus вне форума Ответить с цитированием
Старый 10.01.2011, 00:12   #2
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

не смотрел Ваш пример, но вообще-то,
в теории реляционных СУБД связь многие-ко-многим ВСЕГДА организуется через промежуточную таблицу:
Код:
Организации        |    АдресаОрганизаций  |    Адреса
_______________|___________________ |__________
Код организации         ID записи                     Код адреса
..........                         Код организации            .......
..........                         Код адреса                     ......
Serge_Bliznykov вне форума Ответить с цитированием
Старый 10.01.2011, 01:20   #3
Makarus
Пользователь
 
Регистрация: 18.12.2010
Сообщений: 21
По умолчанию

Цитата:
Сообщение от Serge_Bliznykov Посмотреть сообщение
не смотрел Ваш пример, но вообще-то,
в теории реляционных СУБД связь многие-ко-многим ВСЕГДА организуется через промежуточную таблицу:
Код:
Организации        |    АдресаОрганизаций  |    Адреса
_______________|___________________ |__________
Код организации         ID записи                     Код адреса
..........                         Код организации            .......
..........                         Код адреса                     ......
Здравствуйте, Serge_. Это я понимаю. Суть в другом. У меня связующих таблиц набирается под 20 шт. По каким полям мне лучше организовать связь: только ли по первичному ключу или для каждой связи отдельное поле?
Makarus вне форума Ответить с цитированием
Старый 10.01.2011, 15:01   #4
OlegVE
Форумчанин
 
Регистрация: 27.09.2010
Сообщений: 376
По умолчанию

Цитата:
Сообщение от Makarus Посмотреть сообщение
... По каким полям мне лучше организовать связь: только ли по первичному ключу или для каждой связи отдельное поле?
Не понятен вопрос...

Связующая таблица связывает записи из левой таблицы и правой. Каждая запись в каждой таблице уникальна, по определению. Объединив правую таблицу со связывающей Вы можете найти для каждой отдельной записи из левой таблицы все соответствующие записи из правой, объединив её (лт) с полученным результатом по ключевому полю таблицы (левой), и наоборот объединив левую таблицу со связывающей Вы можете найти для каждой отдельной записи из правой таблицы все соответствующие записи из левой, объединив её (пт) с полученным результатом по ключевому полю таблицы (правой).
Добавка.
Если использовать составной ключ [Код организации]-[Код адреса] невозможно получение дублей записей в связывающей таблице.
Извините что вклиниваюсь: Интересен был бы пример использования [ID записи]. Спасибо.

PS Возвращаясь к исходному вопросу.

Цитата:
Сообщение от Makarus Посмотреть сообщение
...Но как в таком случае "заполнять" связующую таблицу данными - максимально "автоматизированно"???...
Форма с подчинённой формой. Форма - источник записей - левая таблица, подчинённая форма - связывающая таблица, источник строк поля со списком в связывающей таблице - правая таблица. Сами разберётесь с полем со списком, шириной столбцов для этого поля со списком...

Последний раз редактировалось OlegVE; 10.01.2011 в 16:11. Причина: Добавка
OlegVE вне форума Ответить с цитированием
Старый 10.01.2011, 20:47   #5
Makarus
Пользователь
 
Регистрация: 18.12.2010
Сообщений: 21
По умолчанию

Цитата:
Сообщение от OlegVE Посмотреть сообщение

Связующая таблица связывает записи из левой таблицы и правой. Каждая запись в каждой таблице уникальна, по определению. Объединив правую таблицу со связывающей Вы можете найти для каждой отдельной записи из левой таблицы все соответствующие записи из правой, объединив её (лт) с полученным результатом по ключевому полю таблицы (левой), и наоборот объединив левую таблицу со связывающей Вы можете найти для каждой отдельной записи из правой таблицы все соответствующие записи из левой, объединив её (пт) с полученным результатом по ключевому полю таблицы (правой)...
Oleg, спасибо за интерес, и последний вопрос: INSERT, UPDATE и DELETE будут у меня тогда проходить из правой таблицы в правую (правые)?
Makarus вне форума Ответить с цитированием
Старый 10.01.2011, 20:50   #6
Makarus
Пользователь
 
Регистрация: 18.12.2010
Сообщений: 21
По умолчанию

Цитата:
Сообщение от OlegVE Посмотреть сообщение
Форма с подчинённой формой. Форма - источник записей - левая таблица, подчинённая форма - связывающая таблица, источник строк поля со списком в связывающей таблице - правая таблица. Сами разберётесь с полем со списком, шириной столбцов для этого поля со списком...
ОК, принято
Makarus вне форума Ответить с цитированием
Старый 11.01.2011, 14:32   #7
OlegVE
Форумчанин
 
Регистрация: 27.09.2010
Сообщений: 376
По умолчанию

Здравствуйте.

Цитата:
Сообщение от Makarus Посмотреть сообщение
INSERT, UPDATE и DELETE будут у меня тогда проходить из правой таблицы в правую (правые)?
Вопрос опять не понял...

Вы хотите разобраться как работает сама Система управления базой данных?
Нужно ли Вам знать знать работу карбюратора, сцепления и т.д. и т.п. (СУБД) если Вам нужно просто ездить на автомобиле (SQL или неявно строящиеся инструкции SQL в Microsoft Access при визуальной разработке, при этом пользователь вовсе не видит инструкций DDL и ему кажется, что он видит ВСЕ инструкции DML)?

Вы пробовали сделать форму с подчинённой формой и проверить работает ли INSERT, UPDATE и DELETE? Впрочем, можно не отвечать на этот вопрос.

См. Microsoft Access XP Помощь, может здесь для Вас есть ответы:

"Справка Microsoft Access" -> "Работа с таблицами" -> "Настройка связей и параметров целостности данных" -> "Определение связей между таблицами в базе данных Access"

До свидания.

Последний раз редактировалось OlegVE; 11.01.2011 в 14:46.
OlegVE вне форума Ответить с цитированием
Старый 11.01.2011, 23:03   #8
Makarus
Пользователь
 
Регистрация: 18.12.2010
Сообщений: 21
По умолчанию

Здравствуйте, Oleg! Я неправильно выразился в вопросе (не тот семестер... ). Я разобрался - все работает (только по перв кл). Спасибо
Makarus вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Создание связи многие ко многим в Delphi rockedit БД в Delphi 1 11.01.2011 15:10
Связь многие ко многим Dirt БД в Delphi 10 11.05.2010 18:28
select по многим условиям natishka SQL, базы данных 5 06.09.2009 19:23
Связь многие-ко-многим andirock2112 БД в Delphi 10 12.04.2009 22:05
Многие ко многим ("")(Э_Є)("") БД в Delphi 1 12.03.2009 01:18