2013-05-06 3 views
1

Я, как правило, разработчик интерфейса (HTML/CSS и т. Д.), Но в настоящее время мои отбивные застряли в какой-то задней разработке для вызова. Пожалуйста, имейте в виду, что я делал это только в течение нескольких недель, поэтому моя терминология/логика находится в зачаточном состоянии ... Go easy;)Добавление тегов в строку в MySQL db

В качестве отправной точки я создаю вещь в PHP & MySQL, поэтому я могу каталогизировать свою коллекцию винила. Это очень простая форма, в которой художник, название, ярлык и т. Д. Хранятся в базе данных MySQL. Я также хочу реализовать теги для каждой записи, так что один трек может быть помечен «Дом | фанки | вокал ", в то время как другой будет помечен 'dubstep | MC | Бас "или что-то в этом роде.

Я не могу хранить эти теги в массиве в MySQL, поэтому я понимаю, что мне нужно вставить их как значение, разделенное запятыми, а затем, когда я хочу работать с ними на уровне интерфейса, мне нужно потянуть CSV из базы данных, EXPLODE, значение и отображение каждого элемента в виде отдельного элемента списка.

эта часть я понимаю. Но как я могу добавить дополнительные теги? Кажется, я не могу найти окончательный ответ (может быть, я искал неправильную вещь?), Но до сих пор все, что я могу решить, это то, что мне нужно будет использовать текущее значение базы данных «тегов» из db и сохраните это как переменную. Удалите значение «тегов» из базы данных, добавьте новый тег в переменную и затем сохраните новую переменную обратно в базу данных.

Несомненно, есть более простой способ?

+1

'поэтому я понимаю, что мне нужно вставить их как значение, разделенное запятой'. Это последнее, что вы действительно хотели бы сделать. Вы можете просто сохранить эти теги по строкам в таблице, а затем извлечь все из них для своего кода PHP. Не следует хранить теги, такие как CSV в одной строке –

+0

, можете ли вы показать нам какой-то код, что вы пробовали, и именно там, где вы получаете ошибку. –

+0

Hanky ​​Panky, спасибо! Приходя в это как полный новичок, именно эти золотые самородки информации действительно помогают! – MrQwest

ответ

2

Вы должны изучить концепцию таблиц отношений и внешних ключей. Вы бы лучше ломки теги в свой собственный стол, что-то вроде этого:

стол Альбом

album_id album_artist album_title 
--------------------------------------------------- 
1   Nirvana   In Utero 
2   Noisia   Split the Atom 

Метки таблица

album_id tag 
-------------------------------------------------- 
1   Rock 
1   Grunge 
1   Alternative 
2   Dubstep 
2   Drum & Bass 
2   Experimental 

Тогда вы можете присоедините их обратно в список с разделителями-запятыми, используя GROUP CONCAT

SELECT  a.album_artist 
      ,a.album_title 
      ,GROUP_CONCAT(b.tag) AS tags 
FROM  Album a 
JOIN  Tags b 
USING  (album_id) 
WHERE  album_id = xxx 

результатов:

album_artist album_title  tags 
--------------------------------------------------- 
Nirvana   In Utero   Rock, Grunge, Alternative 
Noisia   Split the Atom Dubstep, Drum & Bass, Experimental 

Вы можете дополнительно разбиваете данные в художниках таблицу, где album_artist имя заменяются художник идентификатор в таблице художников и имена тегов разделяются на другую таблицу, а имена тегов заменяются тегами-тегами ...

Отметьте, что GROUP_CONCAT относится только к MySQL ... Довольно уверен, что SQL SERVER 2005 и более чем Я не помню, как они это называют. Также USING (col_name) является специфичным для MySQL, его просто более простой способ написать предложение ON, например ON a.album_id = b.album_id, и его можно использовать только в том случае, если столбцы объединения имеют одинаковое имя. Я просто предпочитаю USING - ON, потому что он короче и делает сложные запросы более читабельными.

https://en.wikipedia.org/wiki/Database_normalization

Редактировать За свой комментарий, вот что это будет выглядеть, если вы сломали тег прочь в свою таблицу. Я добавил еще 2 записи, чтобы показать повтор значение - обратите внимание, как Rock, Dubstep и Экспериментальной используются более чем 1 раз, но их текстовые значения перечислены только один раз ...

Album table: 

album_id album_artist  album_title 
--------------------------------------------------- 
1  Nirvana     In Utero 
2  Noisia     Split the Atom 
3  Nero     Welcome Reality 
4  Pink Floyd    The Wall 

Tags table: 

tag_id tag 
-------------------------------------------------- 
1   Rock 
2   Grunge 
3   Alternative 
4   Dubstep 
5   Drum & Bass 
6   Experimental 

Album_Tags table: 

album_id tag_id 
-------------------------------------------------- 
1   1 
1   2 
1   3 
2   4 
2   5 
2   6 
3   4 
4   1 
4   6 

Запрос:

SELECT  a.album_artist 
      ,a.album_title 
      GROUP CONCAT(c.tag) AS tags 
FROM  Album a 
JOIN  Tags b 
USING  (album_id) 
JOIN  Album_Tags c 
USING  (tag_id) 
WHERE  album_id = xxx 
ORDER BY album_title ASC 

Результаты:

album_artist album_title   tags 
--------------------------------------------------- 
Nirvana  In Utero   Rock, Grunge, Alternative 
Noisia  Split the Atom  Dubstep, Drum & Bass, Experimental 
Pink Floyd The Wall   Rock, Experimental 
Nero   Welcome Reality  Dubstep 
+0

3 общих замечания по пониманию нормализации и дизайна базы данных: если вы набиваете более 1 части информации в значение столбца, вы делаете это неправильно. Если вы обнаружите, что повторяете информацию снова и снова, вы делаете это неправильно. Если вы найдете столбцы с большей частью NULL или пустые значения, вы делаете это неправильно. Конечно, есть исключения из этих правил, но для правильного хранения базы данных вы не можете думать с точки зрения таблиц Excel ... Многие для многих отношений не работают таким образом. – WebChemist

+0

Спасибо WebChemist. Это дало мне отличный совет. Только один комментарий к примеру таблицы тэгов. Скажем, у меня было несколько альбомов под «Rock», я бы присвоил рок несколько раз под «тегом», связанным с уникальным альбомом «album_id»? Я предполагаю, что это правильный способ сделать это вместо того, чтобы «набивать более 1 части информации в значение столбца»? – MrQwest

+0

Я бы переименовал теги в album_tags, а затем создал таблицу тегов, у которой есть только tag_id, tag_name ... так скажите в тегах «Rock» имеет id из 3, везде в таблице album_tags вы должны указать значение 3 вместо слова "Рок". Если вы связываете столбцы таблицы с внешними ключами, это ограничивает идентификаторы только значениями в другой таблице (убедитесь, что у вас нет записей, которые не имеют связанных значений). Кроме того, это позволяет обновить бриз, поскольку, если вы хотите изменить «Rock» на «Hard Rock», вы обновляете только запись 1 тега, а не КАЖДУЮ запись альбома – WebChemist

Смежные вопросы