3

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

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

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

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

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

4

4 回答 4

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

于 2013-09-17T13:16:52.157 回答
1

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

mySQL 触发器

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

于 2013-09-17T13:09:11.790 回答
1

MySQL 中没有本地方法可以Student_Addresses在您的情况下填充 - 您必须自己处理输入数据(连接),但您可以使用 - 例如 - 事务 - 请参阅本主题中的答案:SQL Server: Is it possible to同时插入两个表?

为了照顾连接的一致性 - 在与 ID from和 ID fromStudent_Addresses的关系中创建非空字段,将这两个字段一起作为唯一键并使用and 。当从其他两个表中的任何一个中删除记录时,这将负责从联结表中删除记录,并且也不允许您将相同的地址添加到同一个学生两次。StudentAddressON UPDATE CASCADEON DELETE CASCADE

于 2013-09-17T13:14:27.693 回答
0

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

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

于 2013-09-17T13:10:25.067 回答