sql >> Databáze >  >> RDS >> Mysql

Správný způsob, jak nastavit databázi MYSQL pro vyhledávání souvisejících značek?

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ě.




  1. MySQL vyberte, kde má vlastnost pole JSON hodnotu

  2. Jak funguje @@MAX_CONNECTIONS na serveru SQL Server

  3. Mohu pomocí MySql seřadit sloupec, ale 0 je poslední?

  4. Hibernační mapování mezi PostgreSQL enum a Java enum