Jednoduše oddělte své datové entity podle toho, co jsou a co znamenají. Pro title
, tags
a file
zní to, jako byste měli dvě entity:
Picture
----------
ID
Title
File
Tag
----------
ID
Name
Tedy title
a file
(ve vašem případě si myslím, že to ukládáte jako cestu k souboru v systému souborů, což je v pořádku) jsou jedna entita a tag
je svou samostatnou entitou. Od každého Picture
může mít více tag
s a každý tag
může souviset s více Picture
s, je to vztah mnoho k mnoha. Takže by se obecně vytvořila podpůrná tabulka neentit, která by je propojila v databázi:
PictureTagRelationship
----------
PictureID
TagID
Díky tomu můžete získat Picture
:
SELECT Picture.Title, Picture.File FROM Picture WHERE Picture.ID = ?id
a jeho tagy:
SELECT Tag.ID, Tag.Name FROM Tag
INNER JOIN PictureTagRelationship ON Tag.ID = PictureTagRelationship.TagID
WHERE PictureTagRelationship.PictureID = ?id
(Můžete to udělat v jediném dotazu také několika způsoby, jen jsem to pro jednoduchost rozdělil na dva. Dva dotazy by neměly být velký problém, ale pokud potřebujete vysoce optimalizovat režii přístupu k databázi nebo opravdu chci, aby to byl jediný dotaz, pak jsem si jistý, že se dá něco udělat.)
Nebo můžete získat všechny obrázky pro konkrétní značku:
SELECT Picture.ID, Picture.Title, Picture.File FROM Picture
INNER JOIN PictureTagRelationship ON Picture.ID = PictureTagRelationship.PictureID
WHERE PictureTagRelationship.TagID = ?id
Existují další vylepšení, která lze v tomto návrhu provést, a spousta dalších způsobů, jak data prohlížet a hlásit o nich. Ale v tom všem je jeden klíčový bod:
Nepoužívejte k ukládání dat seznamy oddělené čárkami. Normalizujte každou datovou entitu do její vlastní struktury a podle toho ji uložte. Relační databáze jsou na takové věci skvělé. Kdykoli však uložíte samostatné datové prvky jako oddělený řetězec, toto oddělení těchto prvků ztratíte. To ztěžuje podávání zpráv o těchto datech, obtížnější interakci s nimi, hodně obtížnější jej aktualizovat a méně intuitivní pro kohokoli jiného, kdo jej potřebuje podporovat.
Pamatujte, že každé pole v databázi by mělo ukládat jednu informaci a pouze jedna informace. Pokud musíte do jednoho pole nacpat více informací, pak relační databázi nepoužíváte správně.