Страница 1 из 1
БД: замыкание таблицы на саму себя
Добавлено: 2018.06.02, 23:59
GHopper
Приветствую.
Есть некоторая таблица с книгами. Нужно в структуру БД добавить возможность связывать одну книгу с другой. Это удобно, когда нужно предложить клиенту связанные книги (по автору, по жанру и др.) не привязываясь к какой-то заданной логике (связь создает оператор по своему усмотрению).
Имеем:
Код: Выделить всё
books (id int, name varchar)
relations (b1 int, b2 int)
В таблице
relations по полям
b1 и
b2 создаем индекты, добавляем FK на таблицу
books. Более того, по
b1 и
b2 создаем составно PK.
А теперь вопросы:
1. sql-запросы
Код: Выделить всё
insert into relations values(30,27);
insert into relations values(27,30);
создают две записи в таблице. Хотя по факту связь одна. Как избавиться от этой избыточности?
2. Gii сгенерировал для меня стандартный CRUD-интерфейс для управления книгами. В этом интерфейсе предусмотрена только возможность изменять имя книги. Соответственно установку связей придется колхозить самому. Есть для этих целей какое-то готовое решение? Мне не в плане "на все готовенькое" а в смысле "фреймворк готов предложить". Я все-таки изучаю, поэтому нужно базовые этапы самому пройти.
Re: БД: замыкание таблицы на саму себя
Добавлено: 2018.06.03, 23:30
olegtmb
Посмотрите эту тему:
https://www.yiiframework.com/doc/guide/ ... ive-record
Особенно разделы:
- Работа со связными данными;
Связывание посредством промежуточной таблиц;
Сохранение связных данных
Re: БД: замыкание таблицы на саму себя
Добавлено: 2018.06.04, 08:44
goodfriend
1) вы можете в сервисе добавления информации о подобии всегда сортировать значения перед вставкой
Но вообще ваша система неудобна в плане того что заточена делать подобными только 2 книги, а если понадобится несколько, штук 5 отметить как подобные, понадобится n-ое кол-во запросов в базу чтобы получить простой блок похожих книг.
Подойдите к этому со стороны что будет удобнее вашему пользователю, как ему будет удобнее выбирать одной книге подобные ей. Может достаточно просто тэг ввести, которым помечена другая книга, вот они и будут связаны по тегу.
2) У вас форма изменится неизвестным нам способом, кто знает как вы предложите пользователю делать выбор похожих, иак что особо нечего подсказать готового.
Re: БД: замыкание таблицы на саму себя
Добавлено: 2018.06.04, 10:11
GHopper
goodfriend писал(а): ↑2018.06.04, 08:44
Но вообще ваша система неудобна в плане того что заточена делать подобными только 2 книги, а если понадобится несколько, штук 5 отметить как подобные, понадобится n-ое кол-во запросов в базу чтобы получить простой блок похожих книг.
Это откуда должно появиться несколько запросов? Таблица одна, один SELECT возвращает несколько строк. Эта аналогочная Тегам структура с той лишь разницей, что связующая таблица связывает одну и туже таблицу, а не две разные.
По поводу второго варианта - в форму добавил GridView со всеми книгами и возможностью фильтрации. В ActionColumn оставил одну кнопку "+", которая добавляет на форму блок со скрытым input, названием книги и кнопкой "-". Просто удивился, что такая вот тривиальная задача как множественный выбор по большому справочнику никак не оптимизирована в Yii2. Пришлось все самому делать, хотя и получилось всегда 20 строк кода.
Re: БД: замыкание таблицы на саму себя
Добавлено: 2018.06.06, 06:19
goodfriend
GHopper писал(а): ↑2018.06.04, 10:11
Это откуда должно появиться несколько запросов? Таблица одна, один SELECT возвращает несколько строк. Эта аналогочная Тегам структура с той лишь разницей, что связующая таблица связывает одну и туже таблицу, а не две разные.
Я о том что модератор пометит как "похожие" сначала книги
1 2
Потом отметит также
2 3
а потом
3 4
И вот как одним запросом для книги 1 получить что у нее в похожих - 2, 3, 4 ?
Re: БД: замыкание таблицы на саму себя
Добавлено: 2018.06.06, 09:08
GHopper
Без проблем:
Код: Выделить всё
INSERT INTO related(b1,b2) VALUES(XX,XX), VALUES(XX,XX), ..., VALUES(XX,XX);
Но я не понял какова ваша идея? Если это неправильная структура БД, то как правильно? Тэги добавляются в связанную таблицу аналогичным образом (можно одним запросом, можно по одному тегу).
Re: БД: замыкание таблицы на саму себя
Добавлено: 2018.06.06, 14:21
andku83
goodfriend писал(а): ↑2018.06.06, 06:19
Я о том что модератор пометит как "похожие" сначала книги
1 2
Потом отметит также
2 3
а потом
3 4
И вот как одним запросом для книги 1 получить что у нее в похожих - 2, 3, 4 ?
А с чего вы взяли что должно быть именно так?
Есть разные типы схожести:
- групповая или связь по тегам (о которой вы и говорили);
- и просто связи один к одному в которых a -> b -> c -> d - не говорит о том что a -> d