10/10/2018, 11:31
Xin hỏi về giải thuật gửi thư toàn hệ thống (gửi cho thành viên)??
Mình xin dc hỏi giải thuật nào để giải quyết vấn đề admin muốn gửi thư cho toàn hệ thống (gửi cho toàn thể thành viên trên website).
Vấn đề là admin có thể gửi k hạn chế số tin
Vấn đề khi 1 member đọc xong 1 tin nào đó rồi xóa đi, nhưng tin của member khác vẫn chưa bị xóa(nếu member đó chưa xóa).
Nói tóm lại là mình chưa hiểu lắm về qui trình này, cũng như sẽ có bao nhiêu bảng, xin được hỏi về vấn đề này.
Trân trọng.
Vấn đề là admin có thể gửi k hạn chế số tin
Vấn đề khi 1 member đọc xong 1 tin nào đó rồi xóa đi, nhưng tin của member khác vẫn chưa bị xóa(nếu member đó chưa xóa).
Nói tóm lại là mình chưa hiểu lắm về qui trình này, cũng như sẽ có bao nhiêu bảng, xin được hỏi về vấn đề này.
Trân trọng.
Bài liên quan
Hiện mình có 2 bảng là bảng members và bảng message.
Bảng member: Sẽ có ID của member
Bảng message: Sẽ có ID người gửi và ID người nhận.
Khi admin gửi thư đi, sẽ có n(số thành viên) record của bảng message với ID người gửi là của admin, còn lại là ID của người nhận.
Làm cách này quản lý rất đơn giản nhưng sẽ khá tốn dung lượng cho data vì nếu thành viên lớn, mỗi lần gửi thế sẽ tốn nhiều cho data. Vì thế haicop có 1 cái nữa là làm 1-2 bảng nữa để tránh trường hợp gửi nhiều người mà tốn nhiều dung lượng.
Còn mình có 1 ý tưởng đóng góp thêm. Chỉ là ý tưởng có thể có cách khác tốt hơn:
Bảng Message bạn thêm ID người tạo, ID của bảng
Bạn thêm 1 bảng nữa:
Bảng này sẽ có ID người nhận, ID Message và thêm thuộc tính tình trạng.
Bảng member:...
Bảng message: id người gửi, id người nhận, và cột system (cột này 1 là khi thư do amin gửi toàn hệ thống, là 0 khi thư k phải là thư gửi toàn hệ thống, tức là do người này gửi cho người khác).
Bảng message_system: lưu id các message là hệ thống (thư gửi toàn thành viên) và cột thứ 2 là cột member_id, lưu các id người nhận đã xóa message đó. Giải pháp cho kiểu dữ liệu của cột này là kiểu chuỗi, sẽ lưu các id cách nhau bởi dấu phẩy.
Khi member xóa 1 message hệ thống thì sẽ tìm trong bảng message_system id là id của message và cập nhật cột member_id thêm id của người vừa xóa.
Vấn đề khi lấy thư ra inbox, sẽ có 2 việc:
1. Tìm các thư trong bảng message có id người nhận là id đang login + các tin là hệ thống (cột system=1)
2. Tìm trong cột member_id của bảng message_system nếu có id = id người đang login, tức là message này đã bị xóa bởi id đang login, khi đó sẽ k lấy message có id này.
Vậy câu query sẽ same same thế này: select * from message where nguoinhan_id = 'id_login' and sytem = 1 and id !=....
Vấn đề này mình chưa giải quyết dc, vì 1 người có thể xóa nhiều tin hệ thống, khi đó k phải id!= 1 con số mà phải != 1 chuỗi các con số
Xin nghe cao kiến.
for($i=0; $i < count($recipient_id_del); $i++)
{
$arr = explode(',', $recipient_id_del[$i]['recipient_id_del']);
$id_user = $recipient_id_del[$i]['id'];
if(in_array($id, $arr)) $ss[] = " id != $id_user";
}
if($ss!='')
$tt = implode(' and ', $ss); // có dạng id ! 7 and id != 8
Xin hỏi dùng framework gì có liên quan đến explode hay implode nữa sao bạn? Trình kém.
Về vấn đề giải quyết yêu cầu của bạn. Chỉ đơn giản là người A chỉ được xóa tin của người A mà không ảnh hưởng tới người B. Đây là điều dĩ nhiên khi mà hệ thống dùng nhiều user. Có thể bạn đã nghĩ theo 2 cách:
- Admin chỉ insert 1 record mà tất cả các user đều thấy và đọc. Cách này thì có lẽ điều đầu tiên chúng ta thấy được là tốn ít resource. Vì chẳng hạn có 500.000 user mà gửi hết chắc là insert đầy bảng luôn. Vậy để giải quyết theo cách này thì chúng ta cần thế nào?
+ Bảng system_messge (id, title, content, create_time, is_valid);
+ Bảng system_message_log (id, user_id, read_time).
=> Mỗi khi user login vào sẽ check ở bảng system_message xem có tin nào đang ở trạng thái is_valid không và tin này đã có trong system_message_log ứng với user_id? Nếu có thì hiển thị. User đọc tin này thì sẽ insert vào bảng system_message_log và sẽ không hiện nữa.
- Cách 2 thì chỉ cần 1 bảng message như bạn đã làm và riêng biệt cho mỗi user. Nhưng không hiểu sao bạn viết code check nhiều quá? Nhìn rối và không hiểu lắm.