Mysql
 sql >> база данни >  >> RDS >> Mysql

Правилен начин за настройване на база данни MYSQL за търсене на свързани маркери?

Просто отделете обектите си с данни според това какво представляват и какво означават. За 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

Има и други настройки, които могат да бъдат направени в този дизайн и много други начини за преглед и отчитане на данните. Но във всичко това има един ключов момент:

Не използвайте списъци, разделени със запетая, за съхраняване на данни. Нормализирайте всеки обект от данни в собствена структура и го съхранявайте съответно. Релационните бази данни са чудесни за такива неща. Но всеки път, когато съхранявате отделни елементи от данни като разделен низ, губите това разделяне на тези елементи. Това прави по-трудно отчитането на тези данни, по-трудно е да се взаимодейства с тях, много по-труден за актуализиране и по-малко интуитивен за всеки друг, който трябва да го поддържа.

Само не забравяйте, че всяко едно поле в базата данни трябва да съхранява една част от информацията и само една информация. Ако трябва да натъпчете няколко части информация в едно поле, значи не използвате правилно релационната база данни.




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. MySQL Резултати като списък, разделен със запетая

  2. MySQL подобряване на производителността без кеш

  3. Rails валидира уникалността неуспешно при едновременни входове

  4. Как можете да определите колко дисково пространство заема конкретна MySQL таблица?

  5. MySQL драйвер за Rails в Windows 7 x64