在我的网站上,有一个区域,用户可以编写并向任意数量的其他用户发送消息。该消息只能由消息作者指定的用户查看。所以我创建了两个表:Message_Author
和message_Receivers
,并为它们提供了messageID
的公共列。对于发布的每条消息,都会在Message_ Author
$db->query("
INSERT INTO Message_Author
VALUES('$message_id',$_SESSION[email],$message)
");
并进入Message_Receivers:
foreach($receiversUserNameArray as &$value){
$db->query("
INSERT INTO Message_Receivers
VALUES('$message_id',$value)
");
}
现在,消息作者指定的每个用户都可以查看具有该消息ID的消息。问题是如果用户想要“发送给所有”联系人。这可能是数百个用户名,每个用户名都有自己的行占用大量数据库空间。那么有没有更好的方法来链接这两个表之间的messageID而不为每个接收器创建一行?
答案 0 :(得分:1)
使用消息<>用户表是执行此操作的正确方法,但对消息和用户使用数字ID可能更好。理想情况下,布局应如下所示:
User: UserID, UserName, UserEmail, ...
Message: MessageID, Message
Message_Author: UserID, MessageID
Message_Receivers: UserID, MessageID
将Message_Author和Message_Receivers一起滚动也可能是值得的,但最终在SQL中,整个想法是每个数据有一行 - 在您的情况下,您尝试连接消息和用户,因此每个连接一行很合乎逻辑。使用数字ID还可以确保这些连接不会占用太多空间。
答案 1 :(得分:1)
你将无法在那里节省内存。
我假设插入的$message_id
和$value
都是INT
,只是引用另一个表中的ID。因此,如果一条消息对数百名用户可见,是的,Message_Receivers
- 表中的消息将有数百行,但是替代方案是什么?我只能想象你可以把消息链接到组而不是单个用户(假设用户会多次向同一组人发送消息,这实际上可以节省一些内存,但也会让你实现另一个表来保存这些组)。
简而言之,否你已经以正确的方式做到了,如果两列都是INT
,我就不会太害怕增长数据了一行中每列4个字节,因此每行 8个BYTE 乘以几百甚至还不接近MegaBytes。