Po prostu oddziel jednostki danych według tego, czym są i co oznaczają. Dla title
, tags
i file
wygląda na to, że masz dwie jednostki:
Picture
----------
ID
Title
File
Tag
----------
ID
Name
To znaczy title
i file
(w twoim przypadku wydaje mi się, że przechowujesz to jako ścieżkę do pliku w systemie plików, co jest w porządku) to jedna jednostka i tag
jest odrębnym podmiotem. Ponieważ każdy Picture
może mieć wiele tag
s i każdy tag
może odnosić się do wielu Picture
s, to relacja „wielu do wielu”. Tak więc zazwyczaj tworzy się wspierającą tabelę niebędącą encjami, aby połączyć je w bazie danych:
PictureTagRelationship
----------
PictureID
TagID
Dzięki temu możesz uzyskać Picture
:
SELECT Picture.Title, Picture.File FROM Picture WHERE Picture.ID = ?id
i jego tagi:
SELECT Tag.ID, Tag.Name FROM Tag
INNER JOIN PictureTagRelationship ON Tag.ID = PictureTagRelationship.TagID
WHERE PictureTagRelationship.PictureID = ?id
(Możesz to zrobić w jednym zapytaniu na kilka sposobów, po prostu podzieliłem je na dwa dla uproszczenia. Dwa zapytania nie powinny być wielkim problemem, ale jeśli potrzebujesz wysoce zoptymalizować narzut dostępu do bazy danych lub jeśli naprawdę chcę, aby było to pojedyncze zapytanie, jestem pewien, że można coś zrobić.)
Lub możesz uzyskać wszystkie zdjęcia dla określonego tagu:
SELECT Picture.ID, Picture.Title, Picture.File FROM Picture
INNER JOIN PictureTagRelationship ON Picture.ID = PictureTagRelationship.PictureID
WHERE PictureTagRelationship.TagID = ?id
Istnieje wiele innych poprawek, które można wprowadzić do tego projektu, a także wiele innych sposobów przeglądania i raportowania danych. Ale w tym wszystkim jest jeden kluczowy punkt:
Nie używaj list rozdzielanych przecinkami do przechowywania danych. Znormalizuj każdą jednostkę danych do własnej struktury i odpowiednio ją przechowuj. Relacyjne bazy danych są świetne do tego typu rzeczy. Ale za każdym razem, gdy przechowujesz oddzielne elementy danych jako rozdzielany ciąg, tracisz tę separację tych elementów. Utrudnia to raportowanie tych danych, utrudnia interakcję z nimi, dużo trudniej go zaktualizować i mniej intuicyjnie dla każdego, kto potrzebuje go wesprzeć.
Pamiętaj tylko, że każde pole w bazie danych powinno przechowywać jedną informację i tylko jedna informacja. Jeśli musisz upchnąć wiele informacji w jednym polu, oznacza to, że nie używasz odpowiednio relacyjnej bazy danych.