Mysql
 sql >> Teknologi Basis Data >  >> RDS >> Mysql

Cara yang benar untuk mengatur database MYSQL untuk pencarian tag terkait?

Pisahkan saja entitas data Anda berdasarkan apa itu dan apa artinya. Untuk title , tags dan file sepertinya Anda memiliki dua entitas:

Picture
----------
ID
Title
File

Tag
----------
ID
Name

Yaitu, title dan file (dalam kasus Anda, saya kira Anda menyimpannya sebagai jalur ke file pada sistem file, yang baik-baik saja) adalah satu entitas, dan tags adalah entitasnya sendiri yang terpisah. Karena setiap Picture dapat memiliki beberapa tags s dan setiap tags dapat berhubungan dengan beberapa Picture s, ini adalah hubungan banyak-ke-banyak. Jadi orang biasanya akan membuat tabel non-entitas pendukung untuk menautkannya di database:

PictureTagRelationship
----------
PictureID
TagID

Dengan ini, Anda bisa mendapatkan Picture :

SELECT Picture.Title, Picture.File FROM Picture WHERE Picture.ID = ?id

dan tag-nya:

SELECT Tag.ID, Tag.Name FROM Tag
INNER JOIN PictureTagRelationship ON Tag.ID = PictureTagRelationship.TagID
WHERE PictureTagRelationship.PictureID = ?id

(Anda dapat melakukannya dalam satu kueri dalam beberapa cara juga, saya hanya membaginya menjadi dua untuk kesederhanaan. Dua kueri seharusnya tidak menjadi masalah besar, tetapi jika Anda perlu sangat mengoptimalkan overhead akses database Anda atau jika Anda benar-benar ingin itu menjadi satu permintaan maka saya yakin sesuatu dapat dilakukan.)

Atau Anda bisa mendapatkan semua gambar untuk tag tertentu:

SELECT Picture.ID, Picture.Title, Picture.File FROM Picture
INNER JOIN PictureTagRelationship ON Picture.ID = PictureTagRelationship.PictureID
WHERE PictureTagRelationship.TagID = ?id

Ada penyesuaian lain yang dapat dilakukan untuk desain ini dan banyak cara lain untuk melihat dan melaporkan data. Tapi dalam semua ini ada satu poin kunci:

Jangan gunakan daftar yang dipisahkan koma untuk menyimpan data. Normalisasikan setiap entitas data ke dalam strukturnya sendiri dan simpan sesuai dengan itu. Database relasional sangat bagus untuk hal semacam itu. Tetapi setiap kali Anda menyimpan elemen data terpisah sebagai string yang dibatasi, Anda kehilangan pemisahan elemen tersebut. Hal ini membuat lebih sulit untuk melaporkan data tersebut, lebih sulit untuk berinteraksi dengannya, banyak lebih sulit untuk memperbaruinya, dan kurang intuitif bagi orang lain yang perlu mendukungnya.

Ingatlah bahwa setiap bidang dalam database harus menyimpan satu informasi dan hanya satu informasi. Jika Anda harus menjejalkan banyak informasi ke dalam satu bidang, maka Anda tidak menggunakan database relasional dengan benar.




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Bagaimana cara menyimpan Mata Uang Eropa di MySQL?

  2. Cara Memotong Tabel di MySQL

  3. Panggilan UPSERT standar SQL

  4. Skrip Dump Database PHP - apakah ada masalah?

  5. Streaming kumpulan hasil besar dengan MySQL