Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > СУБД, общие вопросы > Связывание таблиц в базе данных Access


Автор: Letion 3.1.2010, 23:28
 Здравствуйте, профессионалы! У меня такая проблема - пишу программу, в которой БД создана в формате Access. В этой базе данных три таблицы - список фамилий (dannue), предметы (dizsiplina) и оценки (ozenka). Цель программы - чтобы для каждой фамилии можно было вводить свой список предметов, а по каждому предмету - свой список оценок. Подскажите, пожалуйста! Как между собой связать эти таблицы? Бьюсь уже который день! У меня получается, что список предметов и оценок одинаков для любой фамилии! Но так ведь не должно быть smile Наведите на путь истинный!

Автор: chip_and_dayl 4.1.2010, 00:13
Вот такого плана

Таблица предмет содержит собственно код предмета и название.

Таблица Фамилий, содержит идентификатор фамилии и собственно фамилию.

Таблица Sv содержит связи между таблицей фамилий и названий предметов: Первое поле идентификатор  с таблицы Фамилий, второе идентификатор с таблицы предметов, третье поле служит для идентификации оценок (тип счетчик) 

Таблица Sv2 содержит связь между предметами и оценками. Первое поле это идентификатор Предмета Студента, второе поле собственно оценка по предмету

Добавлено через 11 минут и 28 секунд
Хотя если оценка по предмету будет одна, то таблицу Sv2 можно убрать,  а поле ssID в таблице Sv нужно заменить на sBal

Автор: Letion 4.1.2010, 12:25
chip_and_dayl! Это нужно делать программно (программу создаю на Делфи) или в приложении Access?

Автор: Данкинг 4.1.2010, 12:45
Letion, судя по скрину chip_and_dayl'а, там определённо Access. smile Правая кнопка на форме со списком таблиц -> "Схема данных".

Автор: Letion 4.1.2010, 14:30
Цитата(Данкинг @ 4.1.2010,  12:45)
Letion, судя по скрину chip_and_dayl'а, там определённо Access. smile Правая кнопка на форме со списком таблиц -> "Схема данных".

Дайте, пожалуйста, ссылки на литературу или страницы по связыванию таблиц Access! Просто никогда этим не занимался! Спасибо!

Автор: Данкинг 4.1.2010, 14:33
Letion, какую литературу по связыванию? smile Ключевые поля в таблице есть? Тогда заходишь в "схему данных", выбираешь нужные таблицы и тянешь мышкой связь между полями таблиц, по которым связываешь.

Автор: chip_and_dayl 4.1.2010, 17:04
Таблицу лучше создать в Accesse, зачем мучатся или извращаться!?! А саму логику работы, создание записей, редактирование и т.д., писать в Делфи.

По поводу связей, я любитель все сам контролировать, поэтому на уровне СУБД (Аксесс) не связываю таблицы. Уже на программном уровне пытаюсь писать так, чтобы целостность связей была собственно целая.

Ну, я так понял, что под связыванием таблиц, ты имел ввиду как все три таблицы вывести как одну без всяких ключевых полей!?!

Добавлено через 3 минуты и 26 секунд
Данкинг
Я б не удивился, если бы еще версию Аксеса назвал:)

Автор: Letion 5.1.2010, 12:45
Извините за задержку ответа - инет барахлил. Вот что у меня получилось:
user posted image Не знаю, правильно ли соединил. Все равно что-то не то. Вот ссылка на саму мою базу данных: http://rubynoid.org.ua/db1.mdb В этой базе данных три таблицы - список фамилий (dannue), предметы (dizsiplina) и оценки (ozenka). Цель программы - чтобы для каждой фамилии можно было вводить свой список предметов, а по каждому предмету - свой список оценок. То есть, к примеру, для Ивановой - свои предметы: математика, английский, история. По математике чтобы стояли свои оценки, к примеру: 33333. Для английского свои:4455. Для истории, к примеру: 5555.
 Для Примова, к примеру, свои предметы: алгебра, геометрия, рус.язык. По алгебре: 3344, по геометрии: 4444, по рус. языку: 5554. И так далее по всем фамилиям. У меня же получается, что добавляемые предметы высвечиваются не по одной фамилии, а по всем фамилиям, т. е. становятся общими. То же самое и с оценками. Добавляю, к примеру 445533 - эти же оценки высвечиваются по всем предметам. как быть? Что не так делаю? Спасибо!

Автор: chip_and_dayl 5.1.2010, 15:45
Глядя на связи, можно сказать, что там все не так:)

Автор: Letion 5.1.2010, 15:48
Цитата(chip_and_dayl @ 5.1.2010,  15:45)
Глядя на связи, можно сказать, что там все не такsmile

Что именно?

Автор: chip_and_dayl 5.1.2010, 15:49
Таблица Данные и Дисциплина должны быть связаны по ключевому полю (кеу1 в таблице Данные и кеу1 в таблице Дисциплина), а что мы видим?

А мы видим... даже не знаю как это назвать.

Добавлено через 57 секунд
Тоже касается таблица Оценки и Дисциплина

Добавлено через 4 минуты и 9 секунд
И при той структуре, что ты сделал, выходит избыточность, то есть предмет "Математика" будет создан столько раз, у скольких студентов этот предмет есть, вместо того, чтобы предмет и связи держать в отдельной таблице

Добавлено через 5 минут и 19 секунд
В этом случае, ты раз занес предметы в базу, и уже при создание нового студента ты ему выбираешь предметы, которые у него есть, а не создаешь новый предмет с тем же название для каждого студента

Автор: Letion 5.1.2010, 16:17
Цитата(chip_and_dayl @ 5.1.2010,  15:49)
Таблица Данные и Дисциплина должны быть связаны по ключевому полю (кеу1 в таблице Данные и кеу1 в таблице Дисциплина), а что мы видим?

Спасибо за подсказку! Сейчас попробую.

Добавлено через 5 минут и 47 секунд
То есть обязательно добавить промежуточные таблицы?

Добавлено через 6 минут и 44 секунды
Как на том рисунке, что Вы мне давали?

Автор: chip_and_dayl 5.1.2010, 16:31
Цитата(Letion @  5.1.2010,  16:17 Найти цитируемый пост)
То есть обязательно добавить промежуточные таблицы?

Ну, если хотим предмет, например, "Математика" вводить 200 раз, вместо одного, то дополнительная таблица не нужна. Иначе ее нужно создать. Лучше все создать как я показал. В этом случае база хранит то что нужно и ничего лишнего (хотя таблицу с именем Sv2 можно и убрать, только в этом случае в таблицу Sv нужно перенести поле ОЦЕНКА)

Автор: Letion 5.1.2010, 18:33
Вот что у меня получилось:
user posted image 
По ходу также, как и на Вашем рисунке?

Автор: chip_and_dayl 5.1.2010, 18:50
Letion
Не походу, а точно как на моем скрине :)

Добавлено через 2 минуты и 24 секунды
Теперь нужно писать логику работы программы на Делфи. Связывание таблиц, точнее вывод всего этого добра в единой таблице делается через запрос на обьединение

Добавлено через 11 минут и 25 секунд
Да,  наверно все-таки поле ozenka  стаблицы Оценка перенести  в таблицу Пр, и тогда таблицу Оценка можно удалить

Автор: Letion 5.1.2010, 19:02
Цитата(chip_and_dayl @ 5.1.2010,  18:50)
Связывание таблиц, точнее вывод всего этого добра в единой таблице делается через запрос на обьединение

А запрос на объединение как делается?  smile Можно еще один примерчик?

Добавлено через 1 минуту и 21 секунду
Или подробное описание? Голова совсем уже не работает smile

Добавлено через 5 минут и 12 секунд
Цитата(chip_and_dayl @ 5.1.2010,  18:50)
Да,  наверно все-таки поле ozenka  стаблицы Оценка перенести  в таблицу Пр, и тогда таблицу Оценка можно удалить

Тоже так считаю, что оценку нужно перенести, чтобы меньше путаницы было. Сейчас сделаю. И как Вы в этом разбираетесь? smile 

Автор: chip_and_dayl 5.1.2010, 19:32
Цитата(Letion @  5.1.2010,  19:02 Найти цитируемый пост)
А запрос на объединение как делается?   Можно еще один примерчик?

или через inner join или через более понятный способ (для начинающих познавать sql) - Таблица1.ПолеПоКоторомИдетСвязьсТаблицей2=Таблица2.ПолеПоКоторомИдетСвязьсТаблицей1
подробнее http://www.sql.ru/docs/sql/u_sql/ch8.shtml

Цитата(Letion @  5.1.2010,  19:02 Найти цитируемый пост)
И как Вы в этом разбираетесь? 

Практика и только практика. А вообще это еще мелочи:)

Автор: Letion 5.1.2010, 20:55
Цитата(chip_and_dayl @ 5.1.2010,  19:32)
Таблица1.ПолеПоКоторомИдетСвязьсТаблицей2=Таблица2.ПолеПоКоторомИдетСвязьсТаблицей1
подробнее http://www.sql.ru/docs/sql/u_sql/ch8.shtml

Да уж! Тут работы, вижу  - непочатый край! Спасибо, chip_and_dayl, за помощь! smile 

Автор: chip_and_dayl 5.1.2010, 21:00
Пожалуйста)

Добавлено через 1 минуту и 41 секунду
Да и знания  СКЛ-запросов пригодится. Без него сейчас никуда

Автор: Letion 6.1.2010, 18:52
Цитата(chip_and_dayl @ 5.1.2010,  19:32)
Цитата(Letion @  5.1.2010,  19:02 Найти цитируемый пост)
А запрос на объединение как делается?   Можно еще один примерчик?

или через inner join или через более понятный способ (для начинающих познавать sql) 

Хотел еще спросить - inner join - что это такое? И sql-запросы можно делать не программно, а через Access? Спасибо!

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)