經常有這樣的經曆,就是登陸一個系統,會有一條系統訊息提示,而這條訊息是針對所有人的,那麼程式是如何區分哪些人已經看過這條訊息哪些人沒看過呢?(因為沒看過的人會有一個提示一直掛在頁頭,而看過的人這個提示會自動消失),請問這種效果用php是如何做到的,資料結構是如何設計?
回複討論(解決方案)
首先得有一個訊息列表,表裡面有個是否閱讀欄位就行了啊
首先得有一個訊息列表,表裡面有個是否閱讀欄位就行了啊
那要是有十萬個使用者,有的看過了有的沒看過 ,這個欄位怎麼標註啊?
這條訊息是誰發的,發給誰 表裡面也都需要記錄啊,這樣你就可以根據每個使用者的使用者id去讀取個人的訊息了
表結構
table1:message
msg_id msg_content publish_time
table2:read
msg_id user_id read_time
發布一條系統訊息 在message插入一條記錄即可
如:
123 “下午休息” 1414468731
看過的人在read表中插入一條記錄
123 5145 1414468745
判斷是否有未讀資訊
select * from message where msg_id not in (select msg_id from read where user_id = 5145)
如果你對sql效率關注 可以用下面的
select * from message where message left join (select* from read where user_id = 5145 )temp on message.msg_id = temp .msg_id where temp.user_id is null;
表結構
table1:message
msg_id msg_content publish_time
table2:read
msg_id user_id read_time
發布一條系統訊息 在message插入一條記錄即可
如:
123 “下午休息” 1414468731
看過的人在read表中插入一條記錄
123 5145 1414468745
判斷是否有未讀資訊
select * from message where msg_id not in (select msg_id from read where user_id = 5145)
如果你對sql效率關注 可以用下面的
select * from message where message left join (select* from read where user_id = 5145 )temp on message.msg_id = temp .msg_id where temp.user_id is null;
謝謝你的詳細回覆,這個方式我也考慮過,只是如果系統訊息發布多了的話,再加上使用者數量大,這樣子操作資料庫量就非常大了,假如有10W使用者,看一條系統訊息就有10W條記錄了,有沒有更簡單的方式呢?
這條訊息是誰發的,發給誰 表裡面也都需要記錄啊,這樣你就可以根據每個使用者的使用者id去讀取個人的訊息了
這是針對所有人的,所以這種推送模式不太合適
表結構
table1:message
msg_id msg_content publish_time
table2:read
msg_id user_id read_time
發布一條系統訊息 在message插入一條記錄即可
如:
123 “下午休息” 1414468731
看過的人在read表中插入一條記錄
123 5145 1414468745
判斷是否有未讀資訊
select * from message where msg_id not in (select msg_id from read where user_id = 5145)
如果你對sql效率關注 可以用下面的
select * from message where message left join (select* from read where user_id = 5145 )temp on message.msg_id = temp .msg_id where temp.user_id is null;
謝謝你的詳細回覆,這個方式我也考慮過,只是如果系統訊息發布多了的話,再加上使用者數量大,這樣子操作資料庫量就非常大了,假如有10W使用者,看一條系統訊息就有10W條記錄了,有沒有更簡單的方式呢?
哈哈 那考慮考慮 redis
10W 用使用者 需要15K記憶體標記使用者是否發送 每條訊息都是15K
1.讀取訊息 setbit msg_123 5415 1
2.判斷是否讀取 getbit msg_123 5415
訊息表有內容和userid,如果userid=0,表示該訊息為全域
使用者表中,可以增加一個欄位記錄查看過的訊息id,用逗號隔開,比如 1,20,123
看過一條就加一個訊息id
如果訊息比較頻繁,可以考慮單獨維護一個訊息查看記錄表,只有uid msgid兩個欄位,記錄已檢視
弄個表把看過的人裝起來???
沒有查詢到的就顯示給他
表結構
table1:message
msg_id msg_content publish_time
table2:read
msg_id user_id read_time
發布一條系統訊息 在message插入一條記錄即可
如:
123 “下午休息” 1414468731
看過的人在read表中插入一條記錄
123 5145 1414468745
判斷是否有未讀資訊
select * from message where msg_id not in (select msg_id from read where user_id = 5145)
如果你對sql效率關注 可以用下面的
select * from message where message left join (select* from read where user_id = 5145 )temp on message.msg_id = temp .msg_id where temp.user_id is null;
謝謝你的詳細回覆,這個方式我也考慮過,只是如果系統訊息發布多了的話,再加上使用者數量大,這樣子操作資料庫量就非常大了,假如有10W使用者,看一條系統訊息就有10W條記錄了,有沒有更簡單的方式呢?
哈哈 那考慮考慮 redis
10W 用使用者 需要15K記憶體標記使用者是否發送 每條訊息都是15K
1.讀取訊息 setbit msg_123 5415 1
2.判斷是否讀取 getbit msg_123 5415
再次謝謝你的協助!
訊息表有內容和userid,如果userid=0,表示該訊息為全域
使用者表中,可以增加一個欄位記錄查看過的訊息id,用逗號隔開,比如 1,20,123
看過一條就加一個訊息id
如果訊息比較頻繁,可以考慮單獨維護一個訊息查看記錄表,只有uid msgid兩個欄位,記錄已檢視
恩恩!這個可以考慮一下,目前也只有這個方式要方便一點啦
沒有查詢到的就顯示給他
恩!可以這樣子試試