mysql - 设计联系人之间关系的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
我知道这不是正确的方法,但我似乎无法通过这部分,我想我需要查询两次名称,或者可能是编程问题而不是设计,我完全迷失了。任何帮助,将不胜感激。提前致谢
解决方案
-- 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_TYPE
为TO_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
推荐阅读
- apiconnect - API Connect 中 API 的 Swagger 文档链接
- python - 使用 keras 分词器预处理 keras 数据集
- javascript - JavaScript Regex 去除没有属性的 html 标签
- admob - 在提交给 Apple 认证团队进行审核之前,我是否应该更改 Admob 测试 ID?SwiftUI
- api - 将 Dialogflow 与 Api 连接
- java - Java中的Codility MaxPathFromTheLeftTopCorner练习
- optimization - 具有 OR 逻辑的 LP / MILP 公式
- azure - 使用静态 IP 部署 Azure kubernetes 入口时出错
- android - 如何在Android中调用CustomView的onDraw(Canvas canvas)函数?
- excel - 将多个电子邮件地址从单行存储到列表/集合