首页 > 解决方案 > 设计联系人之间关系的mysql数据库?

问题描述

我正在尝试设计一个联系人数据库,但我也想跟踪他们与其他联系人的关系,无论是家人、朋友、同事等。我为联系人创建了一个表,并创建了一个关联表来标记关系类型但我不确定我的设计是否正确,我不确定这是否只是正常的多对多关系或某种递归关系。我还想知道如何查询才能获得与一个联系人的所有关系以及与所有联系人的所有关系。

联系人表
CID CFirstName CLastName
1 罗伊·索尔达娜
2 琳达·罗德里格斯
3 赫克托·罗德里格斯

CID 和 C_ID 都相同我只是认为我不能将两列命名相同,所以我给了一个 _。

附属公司表
CID AfiliateType C_ID例如:CID 是 C_ID 1 的母亲
2 妈妈 1
1 儿子 2
3 丈夫 2
3 继父 1
3 妻子 3
选择 Contacts.FirstName、Contacts.LastName、Afiliates.AfiliateType
从联系人
INNER JOIN 附属公司
ON Contacts.CID = 附属公司.C_ID

我知道这不是正确的方法,但我似乎无法通过这部分,我想我需要查询两次名称,或者可能是编程问题而不是设计,我完全迷失了。任何帮助,将不胜感激。提前致谢

标签: mysqlsqldatabasedatabase-design

解决方案


-- 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方式AFF_TYPETO_FIRST 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

推荐阅读