Mysql 如何通过php维护已读/未读消息
这个问题在这篇文章之前可能被问过很多次,但我找不到一个合适的答案,这个答案完全符合我的要求 假设我有两张桌子:Mysql 如何通过php维护已读/未读消息,mysql,message,Mysql,Message,这个问题在这篇文章之前可能被问过很多次,但我找不到一个合适的答案,这个答案完全符合我的要求 假设我有两张桌子: table-1: table_msg ------------------------------------------------------- msg_id | msg_subject | create_time ------------------------------------------------------- 1 | welco
table-1: table_msg
-------------------------------------------------------
msg_id | msg_subject | create_time
-------------------------------------------------------
1 | welcome to this site | 2015-01-01 10:20:30
-------------------------------------------------------
2 | How to visit this site | 2015-01-05 10:30:00
--------------------------------------------------------
3 | Plz pay your member fee | 2015-03-10 09:00:00
--------------------------------------------------------
4 | Important Notice | 2015-06-01 12:20:00
--------------------------------------------------------
5 | Plz change your password| 2015-06-15 13:24:01
--------------------------------------------------------
table-2: table_user
-------------------------------
user_id | last_login
-------------------------------
1 | 2015-03-01 07:00:00
-------------------------------
我几乎一直都能看到解决方案,因为用户id-1
的最后一次登录是在msg\u id-3
之前,所以如果用户id-1
登录2015-06-02
,他会有两条新消息msg\u id-3
和msg\u id-4
。我可以用css加粗这两条消息的主题,将其显示为未读
。现在假设在登录user\u id-1
后打开了msg\u id-4
,但没有打开msg\u id-3
,因此msg\u id-3
仍然是未读的
现在,当同一用户再次登录2015-06-20
,然后在他上次登录后,msg_id-5
可以很容易地识别为未读
,因为它是在他上次登录后发布的2015-06-02
,它可以变为粗体,但是在他上次登录之前发布但仍然没有打开的msg_id-3
呢。它也是未读的
,应该是粗体
如果没有下面这样的单独表格,我如何将msg_id-3
识别为未读
:
table-3: read_msg
------------------------
id | user_id | msg_id
------------------------
1 | 1 | 1
------------------------
1 | 1 | 2
------------------------
1 | 1 | 4
------------------------
table-3
适合少数用户,但如果用户数为5000,总消息数为10000或更高,那么对于mysql引擎来说,该表将是一个相当大的处理空间,并且它将以几何形式日益增大
是否有任何机制/技术或算法,以便与上次登录后发布的消息一起,在上次登录之前未打开的消息也可以被识别为未读
,而无需庞大的read\u msg
表格 为什么不在表中添加一个状态为(1=已读,0=未读)的列(布尔值),在打开某条消息时,该列会将状态更新为已读
表3:读取信息
id |用户id |消息| id |读取
1 | 1 | 1|0
1 | 1 | 2|1
1 | 1 | 4 | 0
考虑以下场景:
用户登录后有7条未读消息。他选择只读1。如果您创建一个查询/算法来使用他的上次登录时间查看未读邮件,它将看到他在邮件发布后登录。但是他读了吗?不…为什么不在表中添加一个状态为(1=已读,0=未读)的列(布尔值),在打开某条消息时,该列将更新状态为已读
表3:读取信息
id |用户id |消息| id |读取
1 | 1 | 1|0
1 | 1 | 2|1
1 | 1 | 4 | 0
考虑以下场景:
用户登录后有7条未读消息。他选择只读1。如果您创建一个查询/算法来使用他的上次登录时间查看未读邮件,它将看到他在邮件发布后登录。但是他读了吗?不…我刚刚注意到,正如您所描述的,您有一个表包含消息。这些信息是给每个人的。我认为达维加尔假设,正如我所做的那样,这些消息是针对每个用户的。在这种情况下,每个用户的每条消息在表_msg中有一行。要获取该特定用户的消息,表必须是:
msg_id | msg_subject | create_time | read |user_id|
--------------------------------------------------------------------------
1 | welcome to this site | 2015-01-01 10:20:30| 0 | 1
--------------------------------------------------------------------------
2 | How to visit this site | 2015-01-05 10:30:00| 0 | 1
--------------------------------------------------------------------------
3 | Plz pay your member fee | 2015-03-10 09:00:00| 1 | 1
--------------------------------------------------------------------------
4 | Important Notice | 2015-06-01 12:20:00| 1 | 1
-------------------------------------------------------------------------
5 | Plz change your password| 2015-06-15 13:24:01| 0 | 1
----------------------------------------------------------------------
那么你只需要做:
select * from table_msg where user_id = 1 and read = 0;
从表_msg中选择*,其中user_id=1,read=0;
这是我能想到的避免第三个表被读取的唯一方法。该表可能会变大,因为某些消息会被复制,但如果您担心这一点,则始终可以删除旧的已读消息。我刚刚注意到,正如您所述,您有一个表包含这些消息。这些信息是给每个人的。我认为达维加尔假设,正如我所做的那样,这些消息是针对每个用户的。在这种情况下,每个用户的每条消息在表_msg中有一行。要获取该特定用户的消息,表必须是:
msg_id | msg_subject | create_time | read |user_id|
--------------------------------------------------------------------------
1 | welcome to this site | 2015-01-01 10:20:30| 0 | 1
--------------------------------------------------------------------------
2 | How to visit this site | 2015-01-05 10:30:00| 0 | 1
--------------------------------------------------------------------------
3 | Plz pay your member fee | 2015-03-10 09:00:00| 1 | 1
--------------------------------------------------------------------------
4 | Important Notice | 2015-06-01 12:20:00| 1 | 1
-------------------------------------------------------------------------
5 | Plz change your password| 2015-06-15 13:24:01| 0 | 1
----------------------------------------------------------------------
read_msg
那么你只需要做:
select * from table_msg where user_id = 1 and read = 0;
从表_msg中选择*,其中user_id=1,read=0;
这是我能想到的避免第三个表被读取的唯一方法。表可能会变大,因为有些消息会被复制,但如果您担心这一点,您可以随时删除旧的已读消息。read
列可以在只有一个用户时执行(将其设置为1),但如果有1000个用户甚至2个用户,您如何区分1
是哪个用户的,user\u id-1
或user\u id-2
?抱歉,认为消息是特定于用户的,更新了答案read
列,如果只有一个用户,则可以(通过将其设置为1)执行此操作,但如果有1000个用户甚至2个用户,您如何区分1
是哪个用户,user\u id-1
或user\u id-2
?抱歉,虽然消息是特定于用户的,但更新了answer10000消息对MySQL来说不算什么。对于正确的索引,数百万行是微不足道的。10000条消息对于MySQL来说不算什么。如果索引正确,数百万行是微不足道的。假设我有5000个用户,那么在给出一条帖子/消息后,在表\u msg
中插入5000行,如果平均每天发布500条消息,那么每天将插入大约2500000行。每个用户每天都不会登录是正常的,因此,如果平均1000个用户在1个月内不会登录,您能想象在1或3个月后,table_msg
中将有多少行吗?我理解您的意思,但SQL是为大型数据集设计的。如果您正确地为表编制索引,或者简单地删除旧的已读消息,那么选择简单行的基本方法就不会有任何问题。你要么有一对多的关系,要么有多对多的关系,并且已经知道实现它们的两种方法。假设我有5000个用户,那么在给出一条帖子/消息后,在表中插入了5000行。\u msg
,如果平均每天发布500条消息,那么大约会有2500000行
read_msg