Проектирование mysql базы данных отношений между контактами? - PullRequest
1 голос
/ 30 марта 2020

Я пытаюсь создать базу данных контактов, но я также хочу отслеживать их отношения с другими контактами, будь то семья, друзья, коллеги и т. Д. c. Я создал таблицу для контактов и создал аффилированную таблицу, которая помечает тип отношений, но я не уверен, правильно ли я сделал дизайн, и я не уверен, будет ли это просто нормальное отношение многие ко многим или какое-то рекурсивное отношения. Я также хотел бы знать, как я буду запрашивать, чтобы иметь возможность получить все отношения для одного контакта и все отношения для всех контактов.

Contacts Table
CID CFirstName CLastName
1   Roy        Saldana
2   Linda      Rodriguez
3   Hector     Rodriguez

Both CID & C_ID are the same I just thought I couldn't name both columns the same so I gave one a _.

Affiliates Table
CID   AfiliateType C_ID <i> ex: CID is the mother of C_ID 1</i>
2     mother        1 
1     son           2 
3     husband       2 
3     step-father   1 
3     wife          3
SELECT Contacts.FirstName, Contacts.LastName, Afiliates.AfiliateType 
FROM Contacts 
INNER JOIN Afiliates 
ON Contacts.CID = Afiliates.C_ID

Я знаю, что это не правильный путь, но я не могу пропустить эту часть, я думаю, что мне нужно запросить имена дважды, или, возможно, это проблема программирования не дизайн, я полностью потерян. Любая помощь будет оценена. Заранее спасибо

Ответы [ 2 ]

1 голос
/ 30 марта 2020
-- 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
0 голосов
/ 30 марта 2020

Да, вам нужно запросить имена дважды. Один раз для Контакта и второй раз для его аффилированного лица:

    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

Ключ должен установить псевдоним для таблицы контактов, чтобы использовать его второй раз в качестве аффилированного контакта.

Пожалуйста, обратите внимание, я не проверял это, поэтому я мог сделать небольшую ошибку, но я надеюсь, что это дает вам идею.

...