|
|
|
Много файлов, много тегов, как оптимально организовать?
|
|||
|---|---|---|---|
|
#18+
Здравствуйте! Не могу понять сколько таблиц и с какими столбцами и связями нужно создать, чтобы решить следующую, вроде бы простую, задачу: Объясню на примере сайта с картинками. Есть много картинок и есть заранее придуманные теги, их штук 100, но со временем администратором добавляются новые. Заходит человек на сайт, ставит галочки около слов: дерево, вода, машина, человек, еще что-то. И из всей базы картинок ему вывыливаются только те, которые одновременно содержат желаемые теги. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.08.2014, 01:36:47 |
|
||
|
Много файлов, много тегов, как оптимально организовать?
|
|||
|---|---|---|---|
|
#18+
обычная связь many-to-many ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.08.2014, 02:04:14 |
|
||
|
Много файлов, много тегов, как оптимально организовать?
|
|||
|---|---|---|---|
|
#18+
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 все. сколь угодно линков между картинкой и тегами. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.08.2014, 09:31:15 |
|
||
|
Много файлов, много тегов, как оптимально организовать?
|
|||
|---|---|---|---|
|
#18+
Спасибо. Но меня мучают сомнения, нужны ли вообще индексы и 3 таблицы. Сейчас сделано так, что из php формы значения тегов передаются не словами, а 4-значными цифрами. Например, если стоит галочка напротив "вода", то передается значение 0311, на против "машина" 1302. Эти же числа уже по сути и являются индексами. Может просто одну таблицу можно сделать из двух колонок url картинки | тег pic1 | 0311 pic1 | 1302 pic1 | еще какое-то число обозначающее новый тег Извиняюсь, если глупости спрашиваю, просто никогда не занимался базами данных, а тут вот надо такую штуку сделать... Еще про поиск не нашел инфы. Подскажите про какой запрос почитать? Надо выводить, только те картинки, которые содержат сразу все выбранные тегаи (логическое И получается). ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.08.2014, 10:08:45 |
|
||
|
Много файлов, много тегов, как оптимально организовать?
|
|||
|---|---|---|---|
|
#18+
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. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.08.2014, 13:50:01 |
|
||
|
Много файлов, много тегов, как оптимально организовать?
|
|||
|---|---|---|---|
|
#18+
Блин, пропустил 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). ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.08.2014, 13:52:05 |
|
||
|
Много файлов, много тегов, как оптимально организовать?
|
|||
|---|---|---|---|
|
#18+
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 картинкам. Сложно-то как все это с наскоку понять :( ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.08.2014, 19:38:35 |
|
||
|
Много файлов, много тегов, как оптимально организовать?
|
|||
|---|---|---|---|
|
#18+
автор надо провести поиск по таблице тегов, чтобы вместо них вернулись числа 1 и 3 бери их в php из чекбоксов ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.08.2014, 22:36:09 |
|
||
|
Много файлов, много тегов, как оптимально организовать?
|
|||
|---|---|---|---|
|
#18+
авторбери их в 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; Он ничего не находит, хотя у первой картинки есть оба этих тега. Я как раз и хочу, чтобы он мне только ее и показал. Напишите подробнее, как запрос формировать. Или ссылку, где подробно и с примерами описано. Нагуглить тоже не выходит. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.08.2014, 23:04:44 |
|
||
|
Много файлов, много тегов, как оптимально организовать?
|
|||
|---|---|---|---|
|
#18+
lucky89, Код: sql 1. Т.е. есть некая строка. В ней есть tag_id. Он не может одновременно быть и 1 и 3. А в этом селекте именно это требуете вы от сервера. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.08.2014, 23:25:58 |
|
||
|
Много файлов, много тегов, как оптимально организовать?
|
|||
|---|---|---|---|
|
#18+
Перечитал кучу форумов, скачал самоучитель по 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 не получается. Синтаксис не понимаю... еще и переменные новые откуда-то и равенства. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.08.2014, 23:57:22 |
|
||
|
Много файлов, много тегов, как оптимально организовать?
|
|||
|---|---|---|---|
|
#18+
Код: sql 1. 2. 3. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.08.2014, 00:48:22 |
|
||
|
Много файлов, много тегов, как оптимально организовать?
|
|||
|---|---|---|---|
|
#18+
автор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' А можно команду с русскими пояснениями? Хочется понять, для чего нужен каждый символ и от куда его брать, чтобы потом я самостоятельно мок запросы составлять. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.08.2014, 20:52:15 |
|
||
|
Много файлов, много тегов, как оптимально организовать?
|
|||
|---|---|---|---|
|
#18+
lucky89, Вот я почему и бросил что-то обьяснять вам. Коллега, вы просто скажите иначе: "Ребята, напишите все за меня, я разбираться не могу и не хочу". При хорошей цене - может, кто и согласится. Писать запросы, не разбираясь в синтаксисе JOIN и не понимая, что именно происходит - нельзя. Читайте доку, читайте "Понимание Sql", например. Мало того, здесь еще и не в джойне дело, а черным по английскому - неизвестная колонка. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.08.2014, 21:14:55 |
|
||
|
Много файлов, много тегов, как оптимально организовать?
|
|||
|---|---|---|---|
|
#18+
Я стараюсь разобраться, но нет литературы, где все было бы подробно описано. "Понимание SQL" конечно классная книжка, но про JOIN в ней ни слова нет, наверное в 1993 году этой функции еще не было... В общем много чего прочитал, много поэксперементировал. Получился вот такой запрос: Код: sql 1. 2. Он верный и работает правильно. А с точки зрения производительности он нормальный? Если есть косяки, поясните, пожалуйста, в чем именно они заключаются. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.08.2014, 13:37:33 |
|
||
|
Много файлов, много тегов, как оптимально организовать?
|
|||
|---|---|---|---|
|
#18+
автор"Понимание SQL" конечно классная книжка, но про JOIN в ней ни слова нет, статей в инете валом. запрос кривой. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.08.2014, 00:44:17 |
|
||
|
Много файлов, много тегов, как оптимально организовать?
|
|||
|---|---|---|---|
|
#18+
авторpic .ID вместо этого надо подставить то на что ссылается pic2tag.pic_id ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.08.2014, 00:45:34 |
|
||
|
Много файлов, много тегов, как оптимально организовать?
|
|||
|---|---|---|---|
|
#18+
lucky89, HAVING count(pic_id)=3 - вот это. Какой глубинный смысл вложил в этот запрос автор? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.08.2014, 11:51:55 |
|
||
|
Много файлов, много тегов, как оптимально организовать?
|
|||
|---|---|---|---|
|
#18+
может, топикстартеру почитать для начала что-нибудь по SQL? Ну хоть вот это http://sql-tutorial.ru/ru/content.html ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.08.2014, 11:55:47 |
|
||
|
Много файлов, много тегов, как оптимально организовать?
|
|||
|---|---|---|---|
|
#18+
автор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. И что подставить? Тегов-то сразу много задается в запросе. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.08.2014, 15:00:44 |
|
||
|
|

start [/forum/topic.php?fid=47&msg=38711552&tid=1834387]: |
0ms |
get settings: |
7ms |
get forum list: |
13ms |
check forum access: |
2ms |
check topic access: |
2ms |
track hit: |
38ms |
get topic data: |
7ms |
get forum data: |
2ms |
get page messages: |
50ms |
get tp. blocked users: |
1ms |
| others: | 202ms |
| total: | 324ms |

| 0 / 0 |
