powered by simpleCommunicator - 2.0.59     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Проектирование БД [игнор отключен] [закрыт для гостей] / Множественные связи
11 сообщений из 11, страница 1 из 1
Множественные связи
    #38554871
Maks112
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Подскажите, пожалуйста, по проектированию.
Есть таблица с ФИО, хобби.
Код: sql
1.
2.
3.
4.
5.
6.
7.
CREATE TABLE IF NOT EXISTS `students` (
  `index` int(10) unsigned NOT NULL AUTO_INCREMENT,
  `name` tinytext NOT NULL,
  `hobby_ids` int(10) unsigned NOT NULL,
  PRIMARY KEY (`index`),
  KEY `hobby_idx` (`hobby_ids`)
) ENGINE=InnoDB  DEFAULT CHARSET=utf8 AUTO_INCREMENT=5 ;



И, соответственно, справочник по хобби.
Код: sql
1.
2.
3.
4.
5.
CREATE TABLE IF NOT EXISTS `hobby` (
  `number` int(10) unsigned NOT NULL AUTO_INCREMENT,
  `name` tinytext NOT NULL,
  PRIMARY KEY (`number`)
) ENGINE=InnoDB  DEFAULT CHARSET=utf8 AUTO_INCREMENT=15 ;



Если хобби одно, то все ок students.hobby_ids ссылается на конкретное поле в таблице hobby. Но у человека может быть несколько хобби... Как лучше это реализовать?
...
Рейтинг: 0 / 0
Множественные связи
    #38554924
sphinx_mv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Maks112Если хобби одно, то все ок students.hobby_ids ссылается на конкретное поле в таблице hobby. Но у человека может быть несколько хобби... Как лучше это реализовать?"Много-во-много" физически реализуется через дополнительную таблицу со связям "один-во-много" в обе стороны...
...
Рейтинг: 0 / 0
Множественные связи
    #38554966
Maks112
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
sphinx_mv,

Спасибо, сделал дополнительную таблицу
Код: sql
1.
2.
3.
4.
5.
6.
CREATE TABLE IF NOT EXISTS `hobbys` (
  `student-id` int(10) unsigned NOT NULL,
  `hobby-id` int(10) unsigned NOT NULL,
  KEY `organiz-id` (`organiz-id`),
  KEY `rubrika-id` (`rubrika-id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;



Поле hobbys.student-id ссылается на students.index, соответственно hobbys.hobby-id ссылается на hobby.number. Вроде понятно. Теперь запросами типа:

Код: sql
1.
SELECT  `index` FROM  `students` WHERE name =  'Ivanov';


Код: plaintext
1.
2.
index
3

Код: sql
1.
SELECT  `hobby-id` FROM  `hobbys` WHERE student-id =  '3';


Код: plaintext
1.
2.
3.
4.
5.
hobby-id
3
5
15
17

Код: sql
1.
SELECT  `name` FROM  `hobby` WHERE number =3 or number =5 or number =15 or number =17;


Код: plaintext
1.
2.
3.
4.
5.
name
hobby name 3
hobby name 5
hobby name 15
hobby name 17

можно получить список хобби для студента Ivanov. А как можно это в одном запросе сделать?

И еще вопрос. Если из таблицы students удаляется/обновляется запись, как автоматизировать удаление/обновление данных в таблице hobbys? Примерчик бы...
...
Рейтинг: 0 / 0
Множественные связи
    #38554976
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Maks112А как можно это в одном запросе сделать?
Использовать JOIN, вестимо..
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Множественные связи
    #38555500
Maks112Если из таблицы students удаляется/обновляется запись, как автоматизировать удаление/обновление данных в таблице hobbys? Примерчик бы...
думал-думал, не придумал как изменение имени студента может повлиять на изменение хобби. Сможете объяснить?

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

Но вот что мне не даёт покоя... Как это связано с проектированием БД?
...
Рейтинг: 0 / 0
Множественные связи
    #38555538
Фотография lLocust
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
нихрена не телепатдумал-думал, не придумал как изменение имени студента может повлиять на изменение хобби. Сможете объяснить?

Ну как же... был Иванов Александр Борисович... стала Иванова Александра Борисовна... любил хоккей, стала любить шопинг....
А вот вопрос... а нужно ли хранить информацию что раньше любил хоккей? и до какого момента ))
...
Рейтинг: 0 / 0
Множественные связи
    #38555621
lLocustНу как же... был Иванов Александр Борисович... стала Иванова Александра Борисовна... любил хоккей, стала любить шопинг....
В процессе обдумывания такая ситуация не исключалась, однако тут может быть вариант, что изменение имени произошло, чтобы ещё больше любить хоккей.
Потому всё-таки связи изменения имени с изменением хобби не видно. Оно конечно может произойти изменение хобби с изменением имени, но автоматизации это как-то плохо поддаётся...
lLocustнужно ли хранить информацию что раньше любил хоккей? и до какого момента )) ну и причём тут автоматизация?
...
Рейтинг: 0 / 0
Множественные связи
    #38555717
Фотография lLocust
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
нихрена не телепатну и причём тут автоматизация?
Автоматизация может и не причем, а вот схему менять нужно...
...
Рейтинг: 0 / 0
Множественные связи
    #38555788
deblogger
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Maks112,

авторCREATE TABLE IF NOT EXISTS `hobbys` (
`student-id` int(10) unsigned NOT NULL,
`hobby-id` int(10) unsigned NOT NULL,


У родителей так же назовите рукоятки:

`student-id` int(10) unsigned NOT NULL
`hobby-id` int(10) unsigned NOT NULL

и тогда базовый запрос будет таким

Код: sql
1.
2.
3.
4.
5.
select students.*, hobby.* from students 
left join hobbys
using(`student-id`)
left join hobby
using (`hobby-id`);



Послей n:n не увидите, там и смотреть не на что, а примари будут по одному каждый.
...
Рейтинг: 0 / 0
Множественные связи
    #38555791
deblogger
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Да, идентификаторы с минусами это, конечно, сильный ход. Тогда уж сразу с пробелами чтоб хоть какая-то прибыль была.
...
Рейтинг: 0 / 0
Множественные связи
    #38555796
deblogger
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
автор Но у человека может быть несколько хобби... Как лучше это реализовать?

Хуже того, более чем 1 человек могут заниматься одним и тем же бездельем.

Выбрать всех студентов подверженных данному хобби.

select * from students join hobbys using(students_id) join hobby using(hobby_id) where hobby_description = 'писать на форумах'
...
Рейтинг: 0 / 0
11 сообщений из 11, страница 1 из 1
Форумы / Проектирование БД [игнор отключен] [закрыт для гостей] / Множественные связи
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]