1

Тема: Чи можливо витягувати many to many одним запитом postgresql?

Ситуація така - є сайт на headless cms, потрібно пришвидшити його роботу оптимізувавши запити до бази даних. Там під капотом для зв'язку з бд використовується бібліотека knex, але думаю це не важливо.

Зараз я бачу як варіант спочатку витягую потрібні дані з однієї таблиці, дивлюсь які id другої і робилю новий запит неї. Так от, мені це здається не оптимальним, хоча хз я не впевнений чи можна витягнути з двох таблиць за один запит. Було би класно побачити приклад такого SQL або knex запиту(але це вже мрії).

А ще можете порадити матеріалів для навчання по базах даних(мені цікаві саме ідеї а не конкретні реалізації, курсів/книг купа а щось конкретне тяжко вибрати)

2 Востаннє редагувалося frz (30.11.2020 23:29:08)

Re: Чи можливо витягувати many to many одним запитом postgresql?

Many to many - це в першу чергу про проектування самої бази, а не про запит.

Наприклад, маємо table1 і table2.
В table1 є ID:

1,2,3,4,5,6,7,8,9

В table2 є ID:

11,22,33,44,55,66,77,88,99

Тепер маємо таблицю many_to_many_table1_table2, в якій є дві колонки: ID1 i ID2.
Значення:

ID1,ID2
1,11
1,22
2,33
3,33
4,33

Сподіваюся, ця демонстрація дає можливість зрозуміти суть поняття many to many.

----

А оптимізація запитів - це наприклад про індекси. Індекси повинні створюватися для кожної сукупності join i where.
Наприклад, якщо table123 джойниться з table234 за колонками table123.column1 = table234.column1 і при цьому ми робимо where за колонкою table123.column2, то:

1) на таблиці table123 повинен бути "мульти-індекс" - це я так називаю один індекс одночасно для двох колонок - column1, column2
2) на таблиці table234 повинен бути індекс для колонки column1.

Якщо таких індексів не існує, то виконується full table scan, що за умови великої кількості даних в таблицях дає низький перфоменс.

Також оптимізація - це ще й про сам сервер, наприклад якщо на ньому вже існує хаос, тобто виконується багато запитів без створених для цього індексів, то оптимізовувати конкретно ваш запит може не мати надто багато сенсу; натомість потрібно визначити які запити "найважчі" і почати з найгіршого. Бо якщо сам сервер завантажений чимось значно важчим, то оптимізовувати ваш запит з 5 секунд до 3 секунд має не надто багато сенсу.

----

Якщо ж ви маєте на увазі щось інше, то поясніть що саме ви вкладаєте в ваше поняття "many to many" і в поняття "оптимізації". Я часом вигадую власні терміни, як ось "мульти-індекс" і це цілком ок; гірше якщо вигаданий мною термін вже існує, але загальноприйнята версія цього терміну означає щось зовсім інше.

Подякували: koala, flatliner, NaharD3