Saya seorang pengembang perangkat lunak. Saya suka kode, tapi saya benci database ... Saat ini, saya membuat situs web di mana pengguna akan diizinkan untuk menandai entitas yang disukai (seperti di FB), beri tag dan komentar .
Saya terjebak pada desain tabel database untuk menangani fungsi ini. Solusi itu sepele, jika kita bisa melakukan ini hanya untuk satu jenis hal (mis. Foto). Tetapi saya perlu mengaktifkan ini untuk 5 hal yang berbeda (untuk saat ini, tetapi saya juga berasumsi bahwa jumlah ini dapat bertambah, seiring dengan meningkatnya seluruh layanan).
Saya menemukan beberapa pertanyaan serupa di sini, tetapi tidak ada yang memiliki jawaban yang memuaskan, jadi saya mengajukan pertanyaan ini lagi.
Pertanyaannya adalah, bagaimana mendesain database dengan benar, efisien dan elastis , sehingga dapat menyimpan komentar untuk tabel yang berbeda , suka untuk tabel yang berbeda dan tag untuk mereka. Beberapa pola desain sebagai jawaban akan lebih baik;)
Penjelasan terperinci : Saya memiliki tabel User
dengan beberapa data pengguna, dan 3 tabel lagi : Photo
dengan foto , Articles
dengan artikel , Places
dengan tempat . Saya ingin mengaktifkan semua pengguna yang login untuk:
mengomentari salah satu dari 3 tabel tersebut
tandai salah satu dari mereka sebagai disukai
tandai salah satu dari mereka dengan beberapa tag
Saya juga ingin menghitung jumlah suka untuk setiap elemen dan berapa kali tag tertentu digunakan.
1 st pendekatan :
a) Untuk tag , saya akan membuat tabel Tag [TagId, tagName, tagCounter]
, maka saya akan membuat banyak-ke-banyak hubungan tabel untuk: Photo_has_tags
, Place_has_tag
, Article_has_tag
.
b) Jumlah yang sama untuk komentar.
c) Aku akan membuat tabel LikedPhotos [idUser, idPhoto]
, LikedArticles[idUser, idArticle]
, LikedPlace [idUser, idPlace]
. Jumlah suka akan dihitung oleh kueri (yang, saya anggap buruk). Dan...
Saya benar-benar tidak suka desain ini untuk bagian terakhir, baunya buruk bagi saya;)
2 nd pendekatan :
Saya akan membuat tabel ElementType [idType, TypeName == some table name]
yang akan diisi oleh administrator (saya) dengan nama-nama tabel yang dapat disukai , dikomentari atau ditandai . Maka saya akan membuat tabel :
a) LikedElement [idLike, idUser, idElementType, idLikedElement]
dan sama untuk Komentar dan Tag dengan kolom yang tepat untuk masing-masing. Sekarang, ketika saya ingin membuat foto disukai saya akan memasukkan:
typeId = SELECT id FROM ElementType WHERE TypeName == 'Photo'
INSERT (user id, typeId, photoId)
dan untuk tempat:
typeId = SELECT id FROM ElementType WHERE TypeName == 'Place'
INSERT (user id, typeId, placeId)
dan seterusnya ... Saya pikir pendekatan kedua lebih baik, tetapi saya juga merasa ada sesuatu yang hilang dalam desain ini juga ...
Akhirnya, saya juga bertanya-tanya di mana tempat terbaik untuk menyimpan counter berapa kali elemen itu disukai. Saya hanya bisa memikirkan dua cara:
- dalam
Photo/Article/Place
tabel elemen ( ) - dengan pilih count ().
Saya harap penjelasan saya tentang masalah ini lebih menyeluruh sekarang.