设计联系人之间关系的 mysql 数据库?
Designing a mysql database of relationships between contacts?
我正在尝试设计一个联系人数据库,但我也想跟踪他们与其他联系人的关系,无论是家人、朋友、同事等。我为联系人创建了一个 table 并创建了一个 affiliates table 标记了关系的类型,但我不确定我的设计是否正确,我不确定这是否只是正常的多对多关系或某种递归关系。我还想知道如何查询才能获得与一个联系人的所有关系以及与所有联系人的所有关系。
联系人 Table
CID CFirstName CLastName
1 罗伊索尔达娜
2 琳达·罗德里格斯
3 赫克托·罗德里格斯
CID 和 C_ID 都是一样的,我只是觉得我不能把两列都命名为相同的,所以我给了一个_。
分支机构 Table
CID AfiliateType C_ID 例如:CID 是 C_ID 1 的母亲
2 妈妈 1
1 儿子 2
3 丈夫 2
3 继父 1
3 妻子 3
SELECT Contacts.FirstName, Contacts.LastName, Afiliates.AfiliateType
来自联系人
INNER JOIN 会员
ON Contacts.CID = Afiliates.C_ID
我知道这不是正确的方法,但我似乎无法通过这部分,我想我需要查询两次名称,或者这可能是编程问题而不是设计问题,我是完全迷路了。任何帮助,将不胜感激。提前致谢
是的,您需要查询两次名称。一次用于联系人,第二次用于其附属机构:
SELECT c.FirstName, c.LastName, a.AfiliateType, ac.FirstName AS AffiliateFirstName, ac.LastName AS AffiliateLastName
FROM Contacts c LEFT JOIN Afiliates a ON c.CID = a.C_ID
LEFT JOIN Contact ac ON a.CID = ac.CID
关键是为联系人设置一个别名table,以便第二次将其用作附属联系人。
请注意,我没有对此进行测试,所以我可能犯了一个小错误,但我希望它能给你一些想法。
-- Contact CID is named FIRST_NAME LAST_NAME.
--
contacts {CID, FIRST_NAME, LAST_NAME}
PK {CID}
AK {FIRST_NAME, LAST_NAME}
-- Contact CID_1 is AFF_TYPE of contact CID_2.
--
affiliates {CID_1, CID_2, AFF_TYPE}
PK {CID_1, CID_2}
FK1 {CID_1} REFERENCES contacts {CID}
FK2 {CID_2} REFERENCES contacts {CID}
CHECK (CID_1 <> CID_2)
联系人 FROM_FIRST
FROM_LAST
是 TO_FIRST
的 AFF_TYPE
TO_LAST
。
SELECT b.FIRST_NAME AS FROM_FIRST
, b.LAST_NAME AS FROM_LAST
, a.AFF_TYPE
, c.FIRST_NAME AS TO_FIRST
, c.LAST_NAME AS TO_LAST
FROM affiliates AS a
JOIN contacts AS b ON b.cid = a.cid_1
JOIN contacts AS c ON c.cid = a.cid_2
WHERE a.cid_1 = the_contact_id
OR a.cid_2 = the_contact_id ;
要考虑的一件事是如何处理对称关系,例如
CID_1 is mother of CID_2
不对称,但 CID_1 is sibling of CID_2
对称。
对于对称关系,通常的方法是只为 CID_1 < CID_2
.
插入行
注:
All attributes (columns) NOT NULL
PK = Primary Key
AK = Alternate Key (Unique)
FK = Foreign Key
我正在尝试设计一个联系人数据库,但我也想跟踪他们与其他联系人的关系,无论是家人、朋友、同事等。我为联系人创建了一个 table 并创建了一个 affiliates table 标记了关系的类型,但我不确定我的设计是否正确,我不确定这是否只是正常的多对多关系或某种递归关系。我还想知道如何查询才能获得与一个联系人的所有关系以及与所有联系人的所有关系。
联系人 Table CID CFirstName CLastName 1 罗伊索尔达娜 2 琳达·罗德里格斯 3 赫克托·罗德里格斯 CID 和 C_ID 都是一样的,我只是觉得我不能把两列都命名为相同的,所以我给了一个_。 分支机构 Table CID AfiliateType C_ID 例如:CID 是 C_ID 1 的母亲 2 妈妈 1 1 儿子 2 3 丈夫 2 3 继父 1 3 妻子 3
SELECT Contacts.FirstName, Contacts.LastName, Afiliates.AfiliateType 来自联系人 INNER JOIN 会员 ON Contacts.CID = Afiliates.C_ID
我知道这不是正确的方法,但我似乎无法通过这部分,我想我需要查询两次名称,或者这可能是编程问题而不是设计问题,我是完全迷路了。任何帮助,将不胜感激。提前致谢
是的,您需要查询两次名称。一次用于联系人,第二次用于其附属机构:
SELECT c.FirstName, c.LastName, a.AfiliateType, ac.FirstName AS AffiliateFirstName, ac.LastName AS AffiliateLastName
FROM Contacts c LEFT JOIN Afiliates a ON c.CID = a.C_ID
LEFT JOIN Contact ac ON a.CID = ac.CID
关键是为联系人设置一个别名table,以便第二次将其用作附属联系人。
请注意,我没有对此进行测试,所以我可能犯了一个小错误,但我希望它能给你一些想法。
-- Contact CID is named FIRST_NAME LAST_NAME.
--
contacts {CID, FIRST_NAME, LAST_NAME}
PK {CID}
AK {FIRST_NAME, LAST_NAME}
-- Contact CID_1 is AFF_TYPE of contact CID_2.
--
affiliates {CID_1, CID_2, AFF_TYPE}
PK {CID_1, CID_2}
FK1 {CID_1} REFERENCES contacts {CID}
FK2 {CID_2} REFERENCES contacts {CID}
CHECK (CID_1 <> CID_2)
联系人 FROM_FIRST
FROM_LAST
是 TO_FIRST
的 AFF_TYPE
TO_LAST
。
SELECT b.FIRST_NAME AS FROM_FIRST
, b.LAST_NAME AS FROM_LAST
, a.AFF_TYPE
, c.FIRST_NAME AS TO_FIRST
, c.LAST_NAME AS TO_LAST
FROM affiliates AS a
JOIN contacts AS b ON b.cid = a.cid_1
JOIN contacts AS c ON c.cid = a.cid_2
WHERE a.cid_1 = the_contact_id
OR a.cid_2 = the_contact_id ;
要考虑的一件事是如何处理对称关系,例如
CID_1 is mother of CID_2
不对称,但 CID_1 is sibling of CID_2
对称。
对于对称关系,通常的方法是只为 CID_1 < CID_2
.
注:
All attributes (columns) NOT NULL
PK = Primary Key
AK = Alternate Key (Unique)
FK = Foreign Key