Orang suka berkomunikasi. Kita sering bercanda bahwa sistem perangkat lunak apa pun selalu berkembang menjadi sistem pengiriman pesan. Artikel ini akan menjelaskan persyaratan sistem dan pendekatan langkah demi langkah untuk merancang model data untuk sistem pesan.
Singkatnya
Fungsionalitas inti dari sistem perpesanan dalam aplikasi adalah untuk mengirim pemberitahuan/pesan untuk pengguna atau sekelompok pengguna. Sistem kami juga memungkinkan seseorang untuk mengirim pesan ke grup pengguna. Grup pengguna jelas dapat dibentuk pada beberapa parameter seperti hak akses, lokasi geografis pengguna, dll.
Sistem ini memungkinkan penerima untuk merespon ke pesan-pesan. Itu juga melacak siapa yang telah membaca pesan dan siapa yang belum.
Selain itu, sistem memiliki pengingat . bawaan mekanisme yang memungkinkan pengirim membuat pengingat, lalu mengirimkan pengingat ke semua penerima sesuai dengan itu.
Entitas dan Hubungan
Dalam model data ini, user
dan message
adalah entitas utama untuk menyimpan detail pengguna dan pesan.
Kolom di user
tabel akan menjadi atribut terkait pengguna seperti first_name
, last_name
, dll.
Beberapa kolom cukup jelas di message
tabel akan menjadi subject
, message_body
, create_date
dan expiry_date
. Saya juga menambahkan kolom kunci asing bernama creator_id
dalam tabel ini yang mengacu pada id
kolom user
meja. Seperti namanya, itu menandakan id pencipta pesan. Karena akan selalu ada satu pembuat untuk sebuah pesan, saya menyimpan kolom ini di tabel pesan saja. Anda mungkin bertanya-tanya mengapa ada expiry_date
kolom dalam tabel. Saya telah menambahkan kolom ini untuk mengelola pengingat pada sebuah pesan. Saya akan menjelaskan lebih lanjut tentang kolom ini nanti di artikel ini.
Tabel terpenting dalam model data ini adalah message_recipient
. Saya akan mengatakan seluruh model data berputar di sekitar tabel ini saja. Salah satu tujuan utama di balik pembuatan tabel ini adalah untuk mengadakan pemetaan antara pesan dan penerimanya. Jadi recipient_id
kolom dalam tabel ini menandakan id penerima, dan kolom ini mengacu pada kolom id user
tabel.
Ketika sebuah pesan dikirim ke satu penerima, satu record akan dimasukkan ke dalam tabel ini dengan id penerima di recipient_id
kolom.
Sekarang Anda mungkin bertanya-tanya apa recipient_group_id
kolom menandakan dalam tabel ini. Di sini, pertama-tama saya harus menjelaskan bagaimana model ini dapat diperluas ke persyaratan pengiriman pesan ke beberapa penerima sekaligus.
Mengirim Pesan ke Grup
Saya butuh tabel lain, yaitu group
, untuk menyimpan detail grup. Karena ada hubungan banyak ke banyak antara user
dan group
tabel, yaitu pengguna dapat menjadi bagian dari lebih dari satu grup, saya akan membuat tabel lain yang disebut user_group
.
Misalnya, jika grup dibentuk dengan 25 pengguna, akan ada 25 catatan, satu untuk setiap pengguna, di user_group
tabel.
Mari kembali ke message_recipient
meja. Saya menambahkan referensi ke kunci utama user_group
tabel ke dalam message_recipient
meja. Saya beri nama recipient_group_id
. Kolom ini akan menyimpan nilai grup pengguna yang menjadi tujuan pengiriman pesan.
Sekarang setiap kali pesan dikirim ke grup, beberapa catatan akan dimasukkan ke dalam message_recipient
tabel berdasarkan jumlah pengguna dalam grup, dan recipient_group_id
akan dicatat sesuai dengan semua catatan tersebut.
Mari saya ilustrasikan lebih lanjut dengan sebuah contoh. Misalkan sebuah pesan dikirim ke sekelompok 10 orang. Dalam hal ini, total 10 catatan, satu untuk setiap recipient_group_id
dari grup, akan dimasukkan ke dalam message_recipient
tabel.
Harap dicatat bahwa jika pesan dikirim ke pengguna, bukan grup, maka recipient_group_id
kolom tetap kosong. Dalam hal ini, user_id
direct langsung akan dicatat di bawah recipient_id
kolom.
Saya akan menambahkan satu kolom lagi yang disebut is_read
ke dalam tabel untuk menahan tanda terhadap pengguna pesan yang menandakan apakah pesan dibaca oleh pengguna atau tidak.
Kunci unik di message_recipient
tabel – Harus ada kunci unik komposit pada kolom message_id
, recipient_id
dan recipient_group_id
, untuk memastikan bahwa hanya ada satu catatan untuk kombinasi unik kolom-kolom ini.
Saya menyimpan is_active
kolom di semua tabel, kecuali tabel pesan dan penerima_pesan, untuk mengaktifkan 'penghapusan lunak' catatan. Karena saya telah menambahkan expiry_date
kolom di tabel pesan, sebuah is_active
kolom tidak diperlukan. Selain itu, kolom ini tidak diperlukan di message_recipient
tabel karena pesan tidak dapat dikembalikan secara langsung setelah dikirim. Namun seseorang dapat membuatnya tidak aktif dengan memperbarui expiry_date
untuk pesan ke tanggal di masa lalu.
Membalas Pesan
Sekarang anggaplah sistem memungkinkan pengguna untuk menanggapi pesan yang diterima. Saya memperluas tabel message
untuk memenuhi persyaratan ini alih-alih membuat tabel baru untuk balasan. Saya akan menambahkan satu kolom bernama parent_message_id
untuk membangun hubungan hierarkis antara pesan. Saya akan memasukkan catatan baru untuk pesan balasan, dan memperbarui parent_message_id
kolom untuk membalas pesan. Model ini mendukung n-level hubungan hierarkis, yaitu membalas pesan balasan juga dapat dilacak melalui model ini.
Dasbor untuk Melihat 'Baca %' Setiap Pesan
is_read
bendera dicatat terhadap setiap catatan pengguna pesan. Nilai untuk flag ini tetap NOL sampai pesan dibaca oleh pengguna. Ini akan diperbarui menjadi SATU segera setelah pesan dibaca oleh pengguna. Berdasarkan nilai kolom, seseorang dapat menentukan 'baca %' untuk pesan yang dikirim ke grup.
Biarkan saya menulis contoh SQL untuk mengambil laporan seperti itu:
SELECT msg.subject, sent_to, msg.create_date, (summ / countt) * 100 AS Read_Per FROM (SELECT msg.subject, grp.name as sent_to, msg.create_date, SUM (is_read) AS summ, COUNT (is_read) AS countt FROM message_recipient msgrec, message msg, user_group ug, group grp WHERE msgrec.message_id = msg.id AND msgrec.recipient_group_id = ug.id AND ug.GROUP_ID = grp.id AND msgrec.recipient_group_id IS NOT NULL GROUP BY msg.subject, grp.name, msg.create_date UNION SELECT msg.subject, u.first_name || ' ' || u.last_name as sent_to, msg.create_date, SUM (is_read) AS summ, COUNT (is_read) AS countt FROM message_recipient msgrec, MESSAGE msg, user u WHERE msgrec.message_id = msg.id AND msgrec.recipient_id = u.id AND msgrec.recipient_group_id IS NULL GROUP BY msg.subject, name, msg.create_date);
Subjek | Dikirim ke | Terkirim | Baca % |
---|---|---|---|
Pengiriman proyek jatuh tempo pada hari Selasa | Tim Pengiriman Proyek | 13/9/2015 08:15 | 42% |
Temui saya hari Senin | John D | 9/10/2015 13:30 | 100% |
Sinkronkan lingkungan pengembang dengan produksi | Tim DBA | 9/9/2015 09:11 | 80% |
Menutup NCR audit | Tim NSS | 9/9/2015 17:50 | 45% |
Mekanisme Mengingatkan
Untuk fungsi pengingat, saya akan menambahkan kolom berikut di tabel pesan:
Is_reminder
– Kolom ini menandai perlu atau tidaknya pengingat untuk pesan tersebut.Reminder_frequency_id
– Kolom ini menandakan frekuensi pengingat. Apakah harus setiap hari atau setiap minggu?Next_remind_date
– Kolom ini berisi tanggal saat pengingat berikutnya perlu dikirim. Pengingat akan dikirim padanext_remind_date
untuk pengguna yang tanda 'is_read' masih NOL. Nilai baru untuk kolom ini akan dihitung setiap kali pengingat dikirim.Expiry_date
– Kolom ini adalah tanggal batas saat pengingat tidak lagi dikirimkan ke pengguna.
Perhitungan next_remind_date
akan menjadi sebagai berikut – Misalkan satu pesan dikirim ke pengguna pada 9/14, Senin dengan 10/5 sebagai tanggal kedaluwarsa untuk itu. Pesan dikirim dengan frekuensi pengingat mingguan. Dalam hal ini, pengingat akan dikirimkan kepada pengguna pada 21/9 dan 28/9 untuk menanggapi mereka melalui email, dan terakhir kali pada 10/5 untuk mendesak mereka agar merespons dalam 24 jam ke depan.
Model Data Akhir
Kesimpulan
Salah satu penggunaan terbaik dari sistem perpesanan ini adalah mengirim pemberitahuan kepada pengguna yang sudah lama tidak aktif dalam sistem. Notifikasi ini dapat dikirim dengan mekanisme pengingat yang diaktifkan, dan notifikasi akan dikirimkan ke pengguna hingga pengguna merespons notifikasi. Pengguna akan dinonaktifkan pada dan setelah tanggal kedaluwarsa jika tidak ada tanggapan terhadap pemberitahuan yang diterima dari mereka.
Saya bermaksud membangun model data untuk sistem perpesanan yang berfungsi penuh, yang dapat dimasukkan ke dalam berbagai sistem untuk mengirim pesan/pemberitahuan. Jangan ragu untuk membagikan pandangan/ masukan/ komentar Anda tentang artikel tersebut.