Страница 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