Secara keseluruhan, saya tidak melihat kekurangan besar dalam penyiapan atau skema Anda saat ini.
Yang saya heran adalah pembagian Anda menjadi 3 tabel Pengguna*. Saya mendapatkan apa yang Anda inginkan dari niat Anda (memiliki hal-hal terkait pengguna yang berbeda secara terpisah) tetapi saya tidak tahu apakah saya akan menggunakan hal yang sama persis. Jika Anda berencana untuk hanya menampilkan data dari User
tabel di situs, ini baik-baik saja, karena info lain tidak diperlukan beberapa kali pada halaman yang sama tetapi jika pengguna perlu menggunakan nama asli mereka dan menampilkan nama asli mereka (seperti John Doe alih-alih doe55) daripada ini akan memperlambat banyak hal ketika data bertambah besar karena Anda mungkin membutuhkan bergabung. Memiliki Preferences
terpisah sepertinya pilihan pribadi. Saya tidak memiliki argumen yang mendukung atau menentangnya.
Tabel many-to-many Anda tidak memerlukan PK tambahan (mis. PostFavoriteID
). Gabungan utama dari kedua PostID
dan UserID
akan cukup karena PostFavoriteID
tidak pernah digunakan di tempat lain. Ini berlaku untuk semua tabel gabungan
Seperti sebelumnya. jawaban, saya tidak melihat keuntungan atau kerugian. Saya mungkin letakkan keduanya di tabel yang sama karena NULL
(atau mungkin lebih baik -1
) nilai tidak akan mengganggu saya.
Saya akan menempatkan mereka ke dalam tabel yang sama menggunakan pemicu untuk menangani peningkatan ViewCount
tabel
Anda menggunakan skema yang dinormalisasi sehingga setiap penambahan dapat dilakukan kapan saja.
Tidak dapat memberi tahu Anda, belum melakukannya, tetapi saya tahu bahwa Solr sangat kuat dan fleksibel, jadi saya pikir Anda harus melakukannya dengan baik.
Ada banyak utas di sini di SO membahas ini. Secara pribadi, saya lebih suka kunci pengganti (atau kunci nomor unik lainnya jika tersedia) karena membuat kueri lebih mudah dan lebih cepat karena int dicari lebih mudah. Jika Anda mengizinkan perubahan nama pengguna/email/apa pun-PK-Anda, maka diperlukan pembaruan besar-besaran. Dengan kunci pengganti, Anda tidak perlu repot.
Yang juga akan saya lakukan adalah menambahkan hal-hal seperti created_at
, last_accessed
at (paling baik dilakukan melalui pemicu atau prosedur IMO) agar beberapa statistik sudah tersedia. Ini benar-benar dapat memberi Anda statistik yang berharga
Strategi lebih lanjut untuk meningkatkan kinerja adalah hal-hal seperti memcache, counter cache, tabel yang dipartisi,... Hal-hal seperti itu dapat didiskusikan ketika Anda benar-benar dikuasai oleh pengguna karena mungkin ada hal/teknologi/teknik/... yang sangat spesifik untuk masalah Anda.