БД: замыкание таблицы на саму себя

Темы, не касающиеся фреймворка, но относящиеся к программированию в целом.
Ответить
GHopper
Сообщения: 83
Зарегистрирован: 2017.06.05, 10:53

БД: замыкание таблицы на саму себя

Сообщение GHopper » 2018.06.02, 23:59

Приветствую.

Есть некоторая таблица с книгами. Нужно в структуру БД добавить возможность связывать одну книгу с другой. Это удобно, когда нужно предложить клиенту связанные книги (по автору, по жанру и др.) не привязываясь к какой-то заданной логике (связь создает оператор по своему усмотрению).

Имеем:

Код: Выделить всё

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-интерфейс для управления книгами. В этом интерфейсе предусмотрена только возможность изменять имя книги. Соответственно установку связей придется колхозить самому. Есть для этих целей какое-то готовое решение? Мне не в плане "на все готовенькое" а в смысле "фреймворк готов предложить". Я все-таки изучаю, поэтому нужно базовые этапы самому пройти.

olegtmb
Сообщения: 18
Зарегистрирован: 2013.08.06, 20:27

Re: БД: замыкание таблицы на саму себя

Сообщение olegtmb » 2018.06.03, 23:30

Посмотрите эту тему: https://www.yiiframework.com/doc/guide/ ... ive-record
Особенно разделы:
  • Работа со связными данными;
    Связывание посредством промежуточной таблиц;
    Сохранение связных данных

goodfriend
Сообщения: 10
Зарегистрирован: 2018.06.02, 09:58

Re: БД: замыкание таблицы на саму себя

Сообщение goodfriend » 2018.06.04, 08:44

1) вы можете в сервисе добавления информации о подобии всегда сортировать значения перед вставкой

Но вообще ваша система неудобна в плане того что заточена делать подобными только 2 книги, а если понадобится несколько, штук 5 отметить как подобные, понадобится n-ое кол-во запросов в базу чтобы получить простой блок похожих книг.
Подойдите к этому со стороны что будет удобнее вашему пользователю, как ему будет удобнее выбирать одной книге подобные ей. Может достаточно просто тэг ввести, которым помечена другая книга, вот они и будут связаны по тегу.

2) У вас форма изменится неизвестным нам способом, кто знает как вы предложите пользователю делать выбор похожих, иак что особо нечего подсказать готового.

GHopper
Сообщения: 83
Зарегистрирован: 2017.06.05, 10:53

Re: БД: замыкание таблицы на саму себя

Сообщение GHopper » 2018.06.04, 10:11

goodfriend писал(а):
2018.06.04, 08:44
Но вообще ваша система неудобна в плане того что заточена делать подобными только 2 книги, а если понадобится несколько, штук 5 отметить как подобные, понадобится n-ое кол-во запросов в базу чтобы получить простой блок похожих книг.
Это откуда должно появиться несколько запросов? Таблица одна, один SELECT возвращает несколько строк. Эта аналогочная Тегам структура с той лишь разницей, что связующая таблица связывает одну и туже таблицу, а не две разные.

По поводу второго варианта - в форму добавил GridView со всеми книгами и возможностью фильтрации. В ActionColumn оставил одну кнопку "+", которая добавляет на форму блок со скрытым input, названием книги и кнопкой "-". Просто удивился, что такая вот тривиальная задача как множественный выбор по большому справочнику никак не оптимизирована в Yii2. Пришлось все самому делать, хотя и получилось всегда 20 строк кода.

goodfriend
Сообщения: 10
Зарегистрирован: 2018.06.02, 09:58

Re: БД: замыкание таблицы на саму себя

Сообщение goodfriend » 2018.06.06, 06:19

GHopper писал(а):
2018.06.04, 10:11
Это откуда должно появиться несколько запросов? Таблица одна, один SELECT возвращает несколько строк. Эта аналогочная Тегам структура с той лишь разницей, что связующая таблица связывает одну и туже таблицу, а не две разные.
Я о том что модератор пометит как "похожие" сначала книги
1 2
Потом отметит также
2 3
а потом
3 4
И вот как одним запросом для книги 1 получить что у нее в похожих - 2, 3, 4 ?

GHopper
Сообщения: 83
Зарегистрирован: 2017.06.05, 10:53

Re: БД: замыкание таблицы на саму себя

Сообщение GHopper » 2018.06.06, 09:08

Без проблем:

Код: Выделить всё

INSERT INTO related(b1,b2) VALUES(XX,XX), VALUES(XX,XX), ..., VALUES(XX,XX);
Но я не понял какова ваша идея? Если это неправильная структура БД, то как правильно? Тэги добавляются в связанную таблицу аналогичным образом (можно одним запросом, можно по одному тегу).

andku83
Сообщения: 797
Зарегистрирован: 2016.07.01, 10:24
Откуда: Харьков

Re: БД: замыкание таблицы на саму себя

Сообщение andku83 » 2018.06.06, 14:21

goodfriend писал(а):
2018.06.06, 06:19
Я о том что модератор пометит как "похожие" сначала книги
1 2
Потом отметит также
2 3
а потом
3 4
И вот как одним запросом для книги 1 получить что у нее в похожих - 2, 3, 4 ?
А с чего вы взяли что должно быть именно так?
Есть разные типы схожести:
- групповая или связь по тегам (о которой вы и говорили);
- и просто связи один к одному в которых a -> b -> c -> d - не говорит о том что a -> d

Ответить