Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/255.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 在mysql中链接表的一种更有效的方法_Php_Mysql - Fatal编程技术网

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

Php 在mysql中链接表的一种更有效的方法,php,mysql,Php,Mysql,在我的网站上,有一个区域,用户可以在其中编写消息并向任意数量的其他用户发送消息。只有消息作者指定的用户才能查看该消息。因此我制作了两个表格:Message\u Author和Message\u Receivers,并给它们一个公共列messageID。对于发布的每一条消息,都会在message\uuuauthor $db->query(" INSERT INTO Message_Author VALUES('$message_id',$_SE

在我的网站上,有一个区域,用户可以在其中编写消息并向任意数量的其他用户发送消息。只有消息作者指定的用户才能查看该消息。因此我制作了两个表格:
Message\u Author
Message\u Receivers
,并给它们一个公共列
messageID
。对于发布的每一条消息,都会在
message\uuuauthor

$db->query("
            INSERT INTO Message_Author
            VALUES('$message_id',$_SESSION[email],$message)
           ");   
并输入到消息接收器中:

foreach($receiversUserNameArray as &$value){

   $db->query("
               INSERT INTO Message_Receivers
               VALUES('$message_id',$value)
              ");
}
因此,现在消息作者指定的每个用户都可以查看具有该消息id的消息。问题是用户是否希望“发送到所有”联系人。这可能是数百个用户名,每个用户名都有自己的行,占用大量数据库空间。那么,有没有更好的方法在这两个表之间链接messageID,而不为每个接收者生成一行呢?

使用messageuser表是正确的方法,但最好同时为消息和用户使用数字id。理想情况下,布局应如下所示:

User: UserID, UserName, UserEmail, ...
Message: MessageID, Message
Message_Author: UserID, MessageID
Message_Receivers: UserID, MessageID

将消息作者和消息接收者放在一起可能也是值得的,但最终在SQL中,整个想法是每个数据有一行-在您的例子中,您试图连接一条消息和一个用户,因此每个连接有一行是非常合乎逻辑的。使用数字ID还可以确保这些连接不会占用太多空间。

您将无法在那里保存内存

我假设插入的
$message\u id
$value
都是
INT
刚刚引用了另一个表中的id。因此,如果一条消息对数百名用户可见,那么在
message\u Receivers
-表中,该消息将有数百行,但替代方案是什么?我只能想象,您可以将消息链接到组而不是单个用户(假设用户将多次向同一组人发送消息,这实际上可以节省一些内存,但还需要实现另一个表来容纳这些组)


因此,简而言之,您已经用正确的方法进行了操作,而且我也不会太担心数据的增长,如果两列都是
INT
,那么一行中每列将4字节,因此,每行8个字节乘以几百个字节,这还不接近兆字节。

我将对其进行设置,以便您的Messages表具有3个必需的列:Message ID、Author ID、,接收者ID。接收者ID中的空值可以默认为与用户匹配的作者ID的所有联系人。这当然是一个好的建议,我会考虑使用它。谢谢,我也会将Message和MessageAuthor合并在一起,因为这是一对一的关系,一般来说不是这样,但在这种情况下可能是这样的-消息可能是代表一个组编写的,也可能是由像这里这样的人编辑的。这就是为什么我宁愿将MessageAuthor和MessageReceivers合并到MessageRelation中,并添加类似RelationType字段的内容。