2013-11-03 223 views
0

我目前忙於在大學裏第二年想做的項目......項目全部是關於用戶和聯繫人,每個用戶可以有很多聯繫人,許多聯繫人可以屬於很多用戶,因爲我認爲它是一個多對多的關係,我想創建一個user_contact表。用戶和聯繫人之間的關係可以是朋友,工作大學或家庭成員......關係也可以是被動或主動狀態。我也想跟蹤最後編輯聯繫人記錄的人,以及某個用戶的日期Mysql數據庫表結構

系統將在某個公司內部使用,系統全部顯示用戶與公司外部聯繫人的關係,例如約翰正在搜索適用於可樂的pam,以及他看到菲爾和他的作品也知道PAM作爲朋友和關係處於活動狀態..

我現在的表結構:

//User table 

user_id | username|password|fname|lname|email 

//Contact_table 
contact_id|fname|lname|contactnumber|email|lastedited|editdate 

//User_contact table 
id|user_id|contact_id|relationship_type|relationship_state 

由於我是新來的mysql的環境,我的問題是我是我要去了解它的正確方法...任何建議將是非常有益的..

,我如何從用戶鏈接的用戶ID表user_contact表中的用戶標識與聯繫人標識相同?

+0

看起來不錯。然而,將關係類型分開設置將允許擴展 – Adsy2010

+0

如果用戶a和b都鏈接到聯繫人1(聯繫人編號1234),但用戶a將他的聯繫人編號更改爲1235,會發生什麼情況......並非設計不正確,但是試圖考慮所有可能的關係變化? – aweis

+0

嗨,評論的thanx,這是我想跟蹤哪個用戶對聯繫人記錄進行最後更改的方式,比如說,約翰和菲爾爲同一家公司工作,所以如果你點擊約翰,你會看到他所知道的所有聯繫人都像pam,而且與phil相同。如果您查看聯繫人pam,您會看到她的所有信息,並且約翰確實對她的記錄進行了最後更改,因此john將對錯誤信息負責...... – Morne

回答

0

聯繫人的版本應該是一個單獨的表格,以避免部分依賴。 此外,它更好地把人給人,所以你不需要聯繫人表 如果你打算使用InnoDB,你應該建立外鍵約束,以將聯繫人和版本表中的person_id鏈接到個人表。 類似的東西:

CREATE TABLE editions (
edit_id INT AUTO_INCREMENT PRIMARY KEY, 
contact_id INT, 
editor_id INT, 
editdate DATE, 
FOREIGN KEY (contact_id) REFERENCES contacts(contact_id), 
FOREIGN KEY (editor_id) REFERENCES users(person_id) 
); 

CREATE TABLE contacts (
person_id INT, 
contact_id INT, 
relationship_type ENUM("friend", "work", "family"), 
relationship_state CHAR(1), 
FOREIGN KEY (person_id) REFERENCES persons(person_id), 
FOREIGN KEY (contact_id) REFERENCES persons(person_id) 
); 

CREATE TABLE persons (
person_id INT AUTO_INCREMENT PRIMARY KEY, 
username VARCHAR(15) UNIQUE NOT NULL, 
password VARCHAR(15) NOT NULL, 
fname VARCHAR(15), 
lname VARCHAR(25), 
email VARCHAR(50) UNIQUE NOT NULL, 
contactnumber VARCHAR(15) 
); 
0

「鏈接」你想被稱爲foreign key,並且可以在CREATE TABLE語句聲明。您可能還想從User_Contact表中刪除多餘的id,並將關係本身聲明爲主鍵。例如,

CREATE TABLE User_Contact(
    user_id INT NOT NULL REFERENCES `User`(user_id), 
    contact_id INT NOT NULL REFERENCES `Contact`(contact_id), 
    -- other columns 
    PRIMARY KEY (user_id, contact_id) 
); 

這告訴user_id S IN User_Contact來自User的DBMS。在MySQL中,這些約束是否實際執行取決於which storage engine you've chosenInnoDB強制執行它們; MyIASM沒有。

+1

此外,我不確定您需要單獨的「id '在user_contact表中。您可以創建一個由'user_id'&'contact_id'組成的複合主鍵,因爲用戶與聯繫人具有唯一的關係。 – Antimony

+0

@Antimony這是一場持續不斷的聖戰,但我傾向於同意你的觀點。我會更新答案以包含該建議。 – Dan