如果“连接它们的外部表”是指第三个表,那么不,没有必要。
不过,您的关系表可能需要做一些工作。您不希望有两个带有用户 ID 的字段。这会让你以后头疼。我建议像这样设置这些表:
USER
user_id (pk)
username
password --Potential security problems, but for academic purposes, sure.
date_registered
family_unit_id
RELATIONSHIP
family_unit_id (fk)
user_id (fk)
spouse_type --(e.g. husband, wife, etc.)
现在您可以通过以下方式建立多对多关系:
SELECT r.family_unit_id, r.user_id, u.username
FROM RELATION r LEFT JOIN USER u ON r.user_id = u.user_id
您的一对一关系将是表之间的同一记录所独有的。在您描述的情况下,与 user_id (妻子)相关的 user_id (丈夫)不是一对一的关系。根据您提供的内容,您可以通过连接数据子集来建立一对一的关系,例如这个示例。
SELECT r1.family_unit_id, r1.username as HusbandName, r2.username as WifeName
FROM (SELECT * FROM RELATION WHERE spouse_type = 'Husband') r1
LEFT JOIN (SELECT * FROM RELATION WHERE spouse_type = 'Wife') r2
ON r2.family_unit_id = r1.family_unit_id
上面的查询基本上得到了两个表,它们的唯一主键是family_unit_ids,用户ID 与丈夫或妻子相关联。然后,您将它们连接在一起。因为我们假设在此示例中已婚家庭单元中的配偶永远不会超过两个,所以这将是一对一的关系。
如果您想建立一对多关系,您可以从 USER 表中选择所有内容,然后加入 RELATIONSHIP 表以显示合作伙伴是谁:
SELECT u.username, r.user_id
FROM USER u LEFT JOIN RELATIONSHIP r ON r.family_unit_id = u.family_unit_id
当然,这将是一个微不足道的结果,因为您会有记录说约翰与约翰和玛丽有关系。但它说明了这一点。通常,通过将更多表添加到此组合中,您将获得对一对多关系更有用的结果。