и связующая таблица, как оптимальнее хранить это для поиска новостей с определенным тегом? оставить many-to-many, или денормализовать и хранить массив тегов для каждой новости?
Many to many, связующая таблица
спасибо, а если скажем будет условий больше чем 1 - по тегам, например select * from news where id in (select id from tag_news where tag_id=x) and condition_2 = y and condition_3=z limit 100, будет ли такой запрос оптимален?
Такой запрос будет неправильным в первую очередь
вы имеете в виду использовать join вместо IN?
Я ничего не имею в виду в данном случае, просто говорю, что запрос у тебя неверный
Не ну и давай на ты, что выкать то? Тут все друзья
поправил select * from news where id in (select news_id from tag_news where tag_id=x) and condition_2 = y and condition_3=z limit 100
Тигран. Давай так. Формулировка задания, DDL , запрос — вопрос.
Вот это вот например — ЭТО ЧТО? and condition_2 = y and condition_3=z Явно это не валидный запрос.
Cорри что ввел в заблуждение, структура примерно следующая: create table news ( id int unsigned auto_increment primary key, created_on datetime not null, main_image varchar(200) not null, category_id int unsigned not null ); create table tags ( id int unsigned auto_increment primary key, name varchar(200) not null ); create table tags_news ( id int unsigned auto_increment primary key, news_id int unsigned not null, tags_id int unsigned not null ); query: SELECT * FROM news WHERE id in (SELECT news_id from tags_news where tags_id = 10) and category_id = 4 limit 100 Вопрос: не оптимальнее ли, при большом кол-ве новостей и связей с тегами (самих тегов около 100), хранить в news колонку tags integer[] , c целью последующей ее индексации
tag_news — в этой таблице не нужен id
Расскажи, как собираешься хранить в news колонку tags integer[] и при этом индексацировать её?
Вопрос: не оптимальнее ли, при большом кол-ве новостей и связей с тегами — нет, не оптимальнее
Спасибо) вернусь в вопросу еще
наверное это имелось в виду, create index tags_ids_idx on news using GIN (tags gin__int_ops); и использовать вместо подзапроса WHERE tags @> ARRAY[10];
Некоторые (в т.ч. и здесь было, если не путаю) пишут, что с использованием tags integer[] и индексацией запросы получаются быстрее. Но лично я не пробовал / repro не видел, если что.
Ну, это да, так можно... Но это только -ВОЛШЕБНЫЙ Postgress!
шел 2020 год, а все про одно и тоже. поищи мой доклад про это по словам токарев facetted seach highload
Обсуждают сегодня