Database
 sql >> Teknologi Basis Data >  >> RDS >> Database

Model Basis Data untuk Sistem Pesan

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 pada next_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.


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Pencarian Pola Skema ke Asosiasi Kelas Data

  2. Prosedur Tersimpan untuk Mendapatkan Informasi Penyimpanan Server di Server

  3. KONSTRAIN KUNCI ASING SQL:Panduan Utama dan Mudah untuk Pemula

  4. Cara Mengklasifikasikan, Menemukan, dan Menyamarkan PII di Basis Data…

  5. Solusi pembaca untuk tantangan Kepulauan Khusus