一种更有效的链接mysql表的方法

时间:2013-10-16 13:19:06

标签: php mysql

在我的网站上,有一个区域,用户可以编写并向任意数量的其他用户发送消息。该消息只能由消息作者指定的用户查看。所以我创建了两个表:Message_Authormessage_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而不为每个接收器创建一行?

2 个答案:

答案 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。