powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / MySQL [игнор отключен] [закрыт для гостей] / Много файлов, много тегов, как оптимально организовать?
20 сообщений из 20, страница 1 из 1
Много файлов, много тегов, как оптимально организовать?
    #38711527
lucky89
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Здравствуйте! Не могу понять сколько таблиц и с какими столбцами и связями нужно создать, чтобы решить следующую, вроде бы простую, задачу:
Объясню на примере сайта с картинками. Есть много картинок и есть заранее придуманные теги, их штук 100, но со временем администратором добавляются новые. Заходит человек на сайт, ставит галочки около слов: дерево, вода, машина, человек, еще что-то. И из всей базы картинок ему вывыливаются только те, которые одновременно содержат желаемые теги.
...
Рейтинг: 0 / 0
Много файлов, много тегов, как оптимально организовать?
    #38711531
Фотография ScareCrow
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
обычная связь many-to-many
...
Рейтинг: 0 / 0
Много файлов, много тегов, как оптимально организовать?
    #38711552
Users
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
lucky89,

да легко.

tbl_picture

id_picture
picture


tbl_tag
id_tag
tag.


Вот две таблицы, в одну у вас ложится сколь угодно картинок, в другую - сколь угодно тегов.
Делаем третью:

tbl_pictute_l_tag - где буква l подразумевает link, лично мне так удобней сразу по названию таблицы понимать, чегой-то там.

tbl_pictute_l_tag
Id
ip_picture
id_tag

все. сколь угодно линков между картинкой и тегами.
...
Рейтинг: 0 / 0
Много файлов, много тегов, как оптимально организовать?
    #38711558
lucky89
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Спасибо. Но меня мучают сомнения, нужны ли вообще индексы и 3 таблицы. Сейчас сделано так, что из php формы значения тегов передаются не словами, а 4-значными цифрами. Например, если стоит галочка напротив "вода", то передается значение 0311, на против "машина" 1302. Эти же числа уже по сути и являются индексами. Может просто одну таблицу можно сделать из двух колонок
url картинки | тег
pic1 | 0311
pic1 | 1302
pic1 | еще какое-то число обозначающее новый тег

Извиняюсь, если глупости спрашиваю, просто никогда не занимался базами данных, а тут вот надо такую штуку сделать...
Еще про поиск не нашел инфы. Подскажите про какой запрос почитать? Надо выводить, только те картинки, которые содержат сразу все выбранные тегаи (логическое И получается).
...
Рейтинг: 0 / 0
Много файлов, много тегов, как оптимально организовать?
    #38711594
Users
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
lucky89,

Можно, но не нужно. Если планируется количество картинок более 10 тысяч - этот путь уже неверный. Если больше 100 тысяч - он не то, что неверный, а порочный.

На самом деле это очень легко. Если все херачить в одну и ту же таблицу, то даже по вашему собственному примеру видно, что pic1 - записан несколько раз, т.е. идут дубли. Вопрос - на хрена они нужны?
Даже в случае, если вы там храните не саму картинку, а лишь ссылку на нее - это уже проблемы с обновлением данных - изменился путь -изменить данные нужно будет столько раз, сколько эта строка записана в таблице.

В моем случае - инфу про pic1 вы храните один раз, всего одной строкой. Изменение данных в одной строке выгодней, чем в куче. Поиск пойдет не по строковым значениям у меня, а по int. Это намного быстрей. Читайте про третью нормальную форму.

Как работать с php, я, увы, не знаю. Но по логике - наименее проблемно было бы напихать данные - id тегов в некую таблицу для поиска с указанием id_session поиска и потом сделать выборку.

select id_picture, picture from tbl_picture p
join tbl_pictute_l_tag pl where pl.id_tag in (select id_tag from tbl_tempsearch where id_session = iID_session).

Можно это же переписать на join.
...
Рейтинг: 0 / 0
Много файлов, много тегов, как оптимально организовать?
    #38711595
Users
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Блин, пропустил on:

Вот так правильно:
select id_picture, picture from tbl_picture p
join tbl_pictute_l_tag pl on p.id_picture = pl.id_picture
where pl.id_tag in (select id_tag from tbl_tempsearch where id_session = iID_session).
...
Рейтинг: 0 / 0
Много файлов, много тегов, как оптимально организовать?
    #38711695
lucky89
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Users, я понял ход ваших мыслей. Если не трудно. посмотрите правильно ли я все сделал:
//Таблица с картинками
create table pic (pic_id int AUTO_INCREMENT NOT NULL,pic varchar(256),PRIMARY KEY(pic_id)) engine myisam;
insert into pic(pic) values('picture_001');
insert into pic(pic) values('picture_002');
select * from pic;
+--------+-------------+
| pic_id | pic |
+--------+-------------+
| 1 | picture_001 |
| 2 | picture_002 |
+--------+-------------+

//Таблица с тегами
create table tag (tag_id int AUTO_INCREMENT NOT NULL,tag varchar(32),PRIMARY KEY(tag_id)) engine myisam;
insert into tag(tag) values('fire');
insert into tag(tag) values('water');
insert into tag(tag) values('air');
insert into tag(tag) values('earth');
select * from tag;
+--------+-------+
| tag_id | tag |
+--------+-------+
| 1 | fire |
| 2 | water |
| 3 | air |
| 4 | earth |
+--------+-------+

//Таблица со связями
create table pic2tag (pic2tag_id int AUTO_INCREMENT NOT NULL,pic_id int NOT NULL,tag_id int NOT NULL,PRIMARY KEY(pic2tag_id)) engine myisam;
insert into pic2tag(pic_id,tag_id) values('1','1');
insert into pic2tag(pic_id,tag_id) values('1','2');
insert into pic2tag(pic_id,tag_id) values('1','3');
insert into pic2tag(pic_id,tag_id) values('2','3');
insert into pic2tag(pic_id,tag_id) values('2','4');
select * from pic2tag;
+------------+--------+--------+
| pic2tag_id | pic_id | tag_id |
+------------+--------+--------+
| 1 | 1 | 1 |
| 2 | 1 | 2 |
| 3 | 1 | 3 |
| 4 | 2 | 3 |
| 5 | 2 | 4 |
+------------+--------+--------+

На этом остановился, с запросом не понял. Там какая последовательность действий получается? Пусть выбраны теги Огонь и Воздух. Значит мне в запрос для базы передались переменные fire и air, надо провести поиск по таблице тегов, чтобы вместо них вернулись числа 1 и 3? Потом то этим числам в таблице pic2tag найти соответствующие id картинок? Он же мне оба номера вернет, так как тег 3 присвоен 1 и 2 картинкам. Сложно-то как все это с наскоку понять :(
...
Рейтинг: 0 / 0
Много файлов, много тегов, как оптимально организовать?
    #38711723
Фотография ScareCrow
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
автор надо провести поиск по таблице тегов, чтобы вместо них вернулись числа 1 и 3

бери их в php из чекбоксов
...
Рейтинг: 0 / 0
Много файлов, много тегов, как оптимально организовать?
    #38711728
lucky89
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
авторбери их в php из чекбоксов
Тогда я не понимаю, зачем нужна таблица tag?
Я же так и представлял, что числа берутся из php и сразу в таблицу со связями tag2pic, теги же сразу в числовом формате, значит и поиск тормозить не будет. Зачем таблица pic это вроде я понял, чтобы 100 раз одни и те же текстовые значения не писать, а заменить их на числовые и уже потом 100 раз писать эти более легкие числовые.
У меня с правильным запросом сейчас беда. Не понимаю что и в какой последовательности и из каких таблиц брать?
Пишу вот
SELECT pic_id FROM pic2tag WHERE tag_id=3;
Он мне выдает оба номера картинок, все верно, так как в обеих есть тег 3.
Пишу
SELECT * FROM pic2tag WHERE tag_id=1 AND tag_id=3;
Он ничего не находит, хотя у первой картинки есть оба этих тега. Я как раз и хочу, чтобы он мне только ее и показал.
Напишите подробнее, как запрос формировать. Или ссылку, где подробно и с примерами описано. Нагуглить тоже не выходит.
...
Рейтинг: 0 / 0
Много файлов, много тегов, как оптимально организовать?
    #38711735
Users
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
lucky89,

Код: sql
1.
SELECT * FROM pic2tag WHERE tag_id=1 AND tag_id=3;



Т.е. есть некая строка. В ней есть tag_id. Он не может одновременно быть и 1 и 3. А в этом селекте именно это требуете вы от сервера.
...
Рейтинг: 0 / 0
Много файлов, много тегов, как оптимально организовать?
    #38711742
lucky89
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Перечитал кучу форумов, скачал самоучитель по mysql, тоже уже половину прочитал и с горем пополам сделал работающий запрос:
mysql> SELECT pic FROM pic WHERE pic_id=(SELECT pic_id FROM pic2tag WHERE tag_id IN(3,2,1) GROUP BY pic_id HAVING count(pic_id) = 3);
Выдает, как должен, картинку1. Если count(pic_id) = 3 меняю на 1, то выдает картинку2, если меняю на 2, то ничего не выдает, так как такой действительно не существует. Но, наверное, то, что я сконструировал, это что-то очень корявое и при большой базе будет тормозить...
А как вы советуете, через JOIN ON не получается. Синтаксис не понимаю... еще и переменные новые откуда-то и равенства.
...
Рейтинг: 0 / 0
Много файлов, много тегов, как оптимально организовать?
    #38711750
Фотография ScareCrow
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: sql
1.
2.
3.
SELECT * FROM pic 
INNER JOIN pic2tag  ON pic .ID = pic2tag.pic_id 
WHERE pic2tag.tag_id IN(3,2,1)
...
Рейтинг: 0 / 0
Много файлов, много тегов, как оптимально организовать?
    #38712572
lucky89
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
авторSELECT * FROM pic
INNER JOIN pic2tag ON pic .ID = pic2tag.pic_id
WHERE pic2tag.tag_id IN(3,2,1)
Не работает. Unknown column 'pic.ID' in 'on clause'
А можно команду с русскими пояснениями? Хочется понять, для чего нужен каждый символ и от куда его брать, чтобы потом я самостоятельно мок запросы составлять.
...
Рейтинг: 0 / 0
Много файлов, много тегов, как оптимально организовать?
    #38712580
Users
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
lucky89,

Вот я почему и бросил что-то обьяснять вам. Коллега, вы просто скажите иначе: "Ребята, напишите все за меня, я разбираться не могу и не хочу". При хорошей цене - может, кто и согласится.

Писать запросы, не разбираясь в синтаксисе JOIN и не понимая, что именно происходит - нельзя. Читайте доку, читайте "Понимание Sql", например.
Мало того, здесь еще и не в джойне дело, а черным по английскому - неизвестная колонка.
...
Рейтинг: 0 / 0
Много файлов, много тегов, как оптимально организовать?
    #38716518
lucky89
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Я стараюсь разобраться, но нет литературы, где все было бы подробно описано. "Понимание SQL" конечно классная книжка, но про JOIN в ней ни слова нет, наверное в 1993 году этой функции еще не было...
В общем много чего прочитал, много поэксперементировал. Получился вот такой запрос:
Код: sql
1.
2.
mysql> SELECT pic FROM pic JOIN
(SELECT pic_id FROM pic2tag WHERE tag_id IN(1,2,3) GROUP BY pic_id HAVING count(pic_id)=3) t ON pic.pic_id=t.pic_id;


Он верный и работает правильно. А с точки зрения производительности он нормальный?
Если есть косяки, поясните, пожалуйста, в чем именно они заключаются.
...
Рейтинг: 0 / 0
Много файлов, много тегов, как оптимально организовать?
    #38716694
Фотография ScareCrow
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
автор"Понимание SQL" конечно классная книжка, но про JOIN в ней ни слова нет,
статей в инете валом. запрос кривой.
...
Рейтинг: 0 / 0
Много файлов, много тегов, как оптимально организовать?
    #38716696
Фотография ScareCrow
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
авторpic .ID
вместо этого надо подставить то на что ссылается pic2tag.pic_id
...
Рейтинг: 0 / 0
Много файлов, много тегов, как оптимально организовать?
    #38716752
Users
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
lucky89,

HAVING count(pic_id)=3 - вот это. Какой глубинный смысл вложил в этот запрос автор?
...
Рейтинг: 0 / 0
Много файлов, много тегов, как оптимально организовать?
    #38716753
BagaBaga
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
может, топикстартеру почитать для начала что-нибудь по SQL? Ну хоть вот это http://sql-tutorial.ru/ru/content.html
...
Рейтинг: 0 / 0
Много файлов, много тегов, как оптимально организовать?
    #38716787
lucky89
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
авторHAVING count(pic_id)=3
Ну в IN я задал 3 тега (1,2,3). Мне нужны только те картинки, в которых они все 3 есть одновременно. Получается запрос сначала находит 4 записи:
pic_001 | 1
pic_001 | 2
pic_001 | 3
pic_004 | 3
Потом считает, сколько записей получилось для каждой картинки, получаем, что для pic_001 - 3 записи, для pic_002 - 1 запись:
pic_001 | count=3
pic_002 | count=1
И выводится только, та у которой count = количеству тегов, то есть 3 в данном случае, то есть pic_001.
Осталась единственная картинка, удовлетворяющая трем заданным тегам одновременно. Как я и хотел.
Не спорю, что это скорее всего не самый производительный запрос, вот и пытаюсь узнать, как можно проще.
автор что-нибудь по SQL? Ну хоть вот это http://sql-tutorial.ru/ru/content.html
Ушел читать - может хоть там найду ответ на свой вопрос.
авторpic .ID
вместо этого надо подставить то на что ссылается pic2tag.pic_id
Не понятно. Ну в таблице pic2tag pic_id связан только с tag_id. И что подставить? Тегов-то сразу много задается в запросе.
...
Рейтинг: 0 / 0
20 сообщений из 20, страница 1 из 1
Форумы / MySQL [игнор отключен] [закрыт для гостей] / Много файлов, много тегов, как оптимально организовать?
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]