Просто отделете обектите си с данни според това какво представляват и какво означават. За title
, tags
и file
звучи сякаш имате две субекти:
Picture
----------
ID
Title
File
Tag
----------
ID
Name
Тоест title
и file
(във вашия случай предполагам, че го съхранявате като път до файла във файловата система, което е добре) са един обект и tag
е своя отделна единица. Тъй като всяка Picture
може да има множество tag
s и всеки tag
може да се отнася до множество Picture
s, това е връзка много към много. Така че обикновено се създава поддържаща таблица без обекти, за да ги свърже в базата данни:
PictureTagRelationship
----------
PictureID
TagID
С това можете да получите Picture
:
SELECT Picture.Title, Picture.File FROM Picture WHERE Picture.ID = ?id
и неговите тагове:
SELECT Tag.ID, Tag.Name FROM Tag
INNER JOIN PictureTagRelationship ON Tag.ID = PictureTagRelationship.TagID
WHERE PictureTagRelationship.PictureID = ?id
(Можете да направите това и с една заявка по няколко начина, аз просто го разделих на две за простота. Двете заявки не би трябвало да са голяма работа, но ако трябва да оптимизирате силно достъпа си до базата данни или ако наистина искам това да е една заявка, тогава съм сигурен, че нещо може да се направи.)
Или можете да получите всички снимки за конкретен етикет:
SELECT Picture.ID, Picture.Title, Picture.File FROM Picture
INNER JOIN PictureTagRelationship ON Picture.ID = PictureTagRelationship.PictureID
WHERE PictureTagRelationship.TagID = ?id
Има и други настройки, които могат да бъдат направени в този дизайн и много други начини за преглед и отчитане на данните. Но във всичко това има един ключов момент:
Не използвайте списъци, разделени със запетая, за съхраняване на данни. Нормализирайте всеки обект от данни в собствена структура и го съхранявайте съответно. Релационните бази данни са чудесни за такива неща. Но всеки път, когато съхранявате отделни елементи от данни като разделен низ, губите това разделяне на тези елементи. Това прави по-трудно отчитането на тези данни, по-трудно е да се взаимодейства с тях, много по-труден за актуализиране и по-малко интуитивен за всеки друг, който трябва да го поддържа.
Само не забравяйте, че всяко едно поле в базата данни трябва да съхранява една част от информацията и само една информация. Ако трябва да натъпчете няколко части информация в едно поле, значи не използвате правилно релационната база данни.