填充第三个表以保持效率

时间:2013-09-17 13:00:22

标签: php mysql sql

我目前正在为一项作业开发一个PHP / MySQL项目。在研究分配工作时有效地设计数据库时,我注意到在许多情况下,只使用两组数据时创建第三个表是一种好习惯。

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

我的问题是:我们如何填充第三张桌子?有没有办法使用主键和/或外键自动完成?

我已经尝试了Google和我的教科书来理解这一点,但我无处可去。非常感谢教程或文章的链接。

感谢您的帮助。我希望问题和例子是清楚的。

4 个答案:

答案 0 :(得分:2)

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将是正确的解决方案。将数据添加到用户表和地址表后,您需要手动将数据添加到user_address表。某些对象关系映射器(ORM)可能会自动将数据添加到第三个表,但您需要定义关系。检查http://docs.doctrine-project.org/projects/doctrine-orm/en/latest/reference/association-mapping.html

http://docstore.mik.ua/orelly/linux/sql/ch02_02.htm

http://www.keithjbrown.co.uk/vworks/mysql/mysql_p7.php

答案 1 :(得分:1)

在基表中插入/更新/删除数据时,可以使用触发器将数据保存在第三个表中。您可以在

了解有关触发器的更多信息

mySQL Triggers

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

答案 2 :(得分:1)

在您的情况下,MySQL中没有填充Student_Addresses的本机方法 - 您必须自己负责输入数据(连接),但是您可以使用 - 例如 - 事务 - 请参阅本主题中的答案:SQL Server: Is it possible to insert into two tables at the same time?

为了保持连接的一致性 - 在Student_Addresses中创建非空字段以获取与Student的ID和来自Address的ID的关系,将这两个字段作为唯一键并且使用ON UPDATE CASCADEON DELETE CASCADE。当从其他两个表中删除记录时,这将处理从联结表中删除记录,并且也不允许您将同一地址添加到同一个学生两次。

答案 3 :(得分:0)

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

我注意到PHP,但使用Hibernate和Java,这可以毫不留情地完成。由于学生和地址的数据可能来自某些Web应用程序,Hibernate可以将java对象映射到表中的记录,并填充关系表。