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.
haicop viết 13:39 ngày 10/10/2018
Chỉ cần 1 bảng, VD bảng email, ID gửi là admin, ID nhận là user, như thế sẽ có nhiều record là các user khác nhau, sau khi đọc xong thì đánh dấu các record này là đã đọc, nếu bạn làm kiểu 1 record cho toàn bộ user thì sẽ phải join 1 2 bảng nữa cho phần đã đọc hay chưa, phức tạp hơn.
php_code viết 13:33 ngày 10/10/2018
MÌnh chưa hiểu lắm về giải thuật này, bạn haicop có thể giải thích 1 chút dùm mình dc k?
Hiện mình có 2 bảng là bảng members và bảng message.
devil0604 viết 13:33 ngày 10/10/2018
Theo mình hiểu ý của bạn haicop là thế này:
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.
php_code viết 13:44 ngày 10/10/2018
Giải pháp của mìh thế này, xin các bạn xem qua thử:

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.
php_code viết 13:31 ngày 10/10/2018
Đã giải quyết được vấn đề:
$recipient_id_del = $this->model->option("select * from vd_message where system = 1");

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
devil0604 viết 13:42 ngày 10/10/2018
Chúc mừng chủ thớt đã tự giải quyết vấn đề ngon lành
sonnb viết 13:33 ngày 10/10/2018
Framework gì mà dùng MVC khi lọc kết quả phải explode thế bạn?
php_code viết 13:32 ngày 10/10/2018
Mình dùng Codeigniter 2.0.x

Xin hỏi dùng framework gì có liên quan đến explode hay implode nữa sao bạn? Trình kém.
sonnb viết 13:39 ngày 10/10/2018
Mình thì không có dùng Codeigniter nên không rõ cái framework này thế nào. Nếu bạn thích tìm hiểu có thể chuyển sang tìm hiểu yiiframework. Framework này hiện tại theo benchmark là tốt nhất trong các framework. Cách làm việc với nó bạn chỉ cần đọc manual cơ bản thôi là đã thấy thích rồi.

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.
Bài liên quan
0