Mysql
 sql >> Baza danych >  >> RDS >> Mysql

Prawidłowy sposób na skonfigurowanie bazy danych MYSQL do wyszukiwania powiązanych tagów?

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.




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Nazwa tabeli MySQL jako parametr

  2. Limit rozmiaru VARCHAR MySQL

  3. Migracyjny klucz obcy a elokwentne relacje w Laravel

  4. Jak używać warunku BETWEEN za pomocą zapytania głównego i podzapytań

  5. dwukrotne dołączanie do tego samego stołu na różnych kolumnach