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.