Php 填充第三个表以保持效率

Php 填充第三个表以保持效率,php,mysql,sql,Php,Mysql,Sql,我目前正在一个PHP/MySQL项目中工作。在研究数据库的有效设计时,我注意到,在许多情况下,当只处理两组数据时,创建第三个表是一种很好的做法 例如,如果我们有一个用于“学生”的表和一个用于“地址”的表,那么创建第三个表(即“学生地址”)似乎是一个好主意,因为假设一个学生可以有多个地址(父母分开等),而一个地址可以代表多个学生(兄弟姐妹) 我的问题是:我们如何填充第三个表?是否有一种方法可以使用主键和/或外键自动完成 我试着用谷歌和我的教科书来理解这一点,但我一无所获。链接到教程或文章将不胜感激

我目前正在一个PHP/MySQL项目中工作。在研究数据库的有效设计时,我注意到,在许多情况下,当只处理两组数据时,创建第三个表是一种很好的做法

例如,如果我们有一个用于“学生”的表和一个用于“地址”的表,那么创建第三个表(即“学生地址”)似乎是一个好主意,因为假设一个学生可以有多个地址(父母分开等),而一个地址可以代表多个学生(兄弟姐妹)

我的问题是:我们如何填充第三个表?是否有一种方法可以使用主键和/或外键自动完成

我试着用谷歌和我的教科书来理解这一点,但我一无所获。链接到教程或文章将不胜感激


谢谢你的帮助。我希望问题和示例都很清楚。

在基本表中插入/更新/删除数据时,可以使用触发器将数据保存在第三个表中。您可以在以下站点了解有关触发器的更多信息:


但是,在您的情况下,如果您可以在应用程序/代码级别编写逻辑,以便在第三个表中创建一个条目,则会更好。您可以从基表设置到此表的外键关系,以便数据保持一致。

我认为数据不会自动填充,而是由用户负责插入数据


我相信PHP,但使用Hibernate和Java可以轻松地完成这项工作。由于学生和地址的数据可能通过某些web应用程序传入,Hibernate可以将java对象映射到表中的记录,还可以填充关系表。

在MySQL中没有原生方法来填充学生地址。在您的情况下-您必须自己输入数据(连接),但您可以使用-例如-事务-请参阅本主题中的答案:


为了保证连接的一致性-在
Student\u Addresses
中为
Student
中的ID和
Address
中的ID设置非空字段,将这两个字段一起设置为唯一键,并在更新级联时使用
,在删除级联时使用
。当从其他两个表中的任何一个表中删除记录时,这将负责从连接表中删除记录,并且不允许您向同一个学生添加相同的地址两次。

n:m或1:m规范化规则

备选案文1:

user table
id
f_name
s_name
......

user address table
id
user_id    // this should be index only as foreign keys will allow 1:1 only
address line 1
address line 2
address line 3
address_type (home, office ....)
备选案文2:

user table
id
f_name
s_name
......

address table
id
address line 1
address line 2
address line 3
address_type (home, office ....)

user_address table
userId
addressId
根据您的描述,选项2将是正确的解决方案。将数据添加到用户表和地址表后,需要手动将数据添加到用户地址表。某些对象关系映射器(ORM)可能会自动将数据添加到第三个表中,但您需要定义关系。检查


这被称为一个。例如,当学生向其个人资料中添加新地址时,您将填充该地址。您可以在
地址表中添加一条记录,然后将其与某个特定的学生绑定,您可以在
学生地址表中写入一条相关记录。您可能会发现搜索“多对多表”也很有帮助。我不确定触发器在这里有何帮助,您能否在回答中澄清?要向学生添加地址,OP只需写入两个表,对吗?一次到
地址
,一次到
学生地址
。我只是想把信息分享给提问者,让他知道有不止一种方法可以将数据保存到另一个表中。不过,我不确定这是否可行。如果“多:多”由触发器自动插入,它将不知道要将新地址加入到哪个学生(除非我遗漏了什么)。您好,您不需要在每个帖子上签名-您的签名块会自动为您签名。为了简洁起见,它们往往会在这里被删除。因此,我很清楚,我需要编写一个单独的insert语句,在用户和地址表中插入初始数据之后,将userID和addressId插入user_地址表?是的,正确。除了使用ORM,我不知道其他解决方案。