我正在构建一个带有补充移动应用的网络应用。让我们说出于问题的目的,Web应用程序用于创建发送给所有或部分移动应用程序用户的消息。我正在尝试确定存储这些消息的最佳方式。
目前,我设置了一个用于存储消息的表messages
和另一个用于存储每条消息的每个收件人记录的表recipients
。
例如,如果我的ID为1
的邮件发送给三个用户alex, bill, chris
,那么recipients
表将如下所示:
recipients_id | message_id | username
1 | 1 | alex
2 | 1 | bill
3 | 1 | chris
message_id
是messages
的主键,username
是users
表中的一个字段(我实际上使用的是INT PK,但只是使用字符串对于这个问题)。
现在想象一下,不是三个用户,而是将消息发送给几百甚至几千个用户。这仍然可行吗?我知道MySQL表可以处理数百万条记录,但我只是想知道这是否是最有效的方法。
答案 0 :(得分:1)
是的,这是在SQL中实现多对多关系的正确方法。
唯一的选择是以逗号分隔的列表。但是你受到了柱子大小的限制。加入这种类型的价值既困难又低效。
答案 1 :(得分:1)
你走在正确的轨道上,是的,我会在收件人表中使用user_id而不是username。 MySQL肯定能够处理这样的数十万条记录,仅受MySQL服务器上RAM数量的限制。
然后,要获取发送给特定用户的消息列表(例如用户ID 2),您可以使用简单的连接查询,如:
SELECT * FROM recipients LEFT JOIN messages ON messages.id = recipients.message_id WHERE recipients.userid = 2
或者获取特定消息的收件人列表(例如消息ID 3);
SELECT * FROM recipients LEFT JOIN users ON user.id = recipients.user_id WHERE recipients.message_id = 3
希望这会有所帮助:)