我目前正在为一项作业开发一个PHP / MySQL项目。在研究分配工作时有效地设计数据库时,我注意到在许多情况下,只使用两组数据时创建第三个表是一种好习惯。
例如,如果我们有一个“学生”表和一个“地址”表,那么创建第三个表即“Student_Addresses”似乎是一个好主意,因为学生可以假设有多个地址(分开)父母等)和一个地址可以代表一个以上的学生(兄弟姐妹)。
我的问题是:我们如何填充第三张桌子?有没有办法使用主键和/或外键自动完成?
我已经尝试了Google和我的教科书来理解这一点,但我无处可去。非常感谢教程或文章的链接。
感谢您的帮助。我希望问题和例子是清楚的。
答案 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。
答案 1 :(得分:1)
在基表中插入/更新/删除数据时,可以使用触发器将数据保存在第三个表中。您可以在
了解有关触发器的更多信息但是在您的情况下,如果您可以在应用程序/代码级别编写逻辑以在第三个表中创建条目,那会更好。您可以从基表中为此表设置外键关系,以使数据保持一致。
答案 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 CASCADE
和ON DELETE CASCADE
。当从其他两个表中删除记录时,这将处理从联结表中删除记录,并且也不允许您将同一地址添加到同一个学生两次。
答案 3 :(得分:0)
我认为数据不会自动填充,而是用户负责插入数据。
我注意到PHP,但使用Hibernate和Java,这可以毫不留情地完成。由于学生和地址的数据可能来自某些Web应用程序,Hibernate可以将java对象映射到表中的记录,并填充关系表。