2011-03-02 28 views
0

比方說,我想通過他們沉迷於使用MS Access的藥物類型來「標記」(用於研究目的)機構中的一組人員。數據庫設計:如何在表格中表示一組對象

喜歡的東西 -

名稱,類型*
瑪麗,酒精
莎莉,酒精
喬,軟性毒品
約翰,硬性毒品
金,月亮藥(這應該被拒絕,因爲它不在下表中)

addiction_type,示例*
1,酒精,啤酒
2,酒精,伏特加
3,酒精,朗姆酒
4,軟藥,阿司匹林
5,硬藥,甲基

如果我想類型*在第一個表是第二個表中的外鍵,我需要創建一個明確的主鍵。 所以我的問題是,我如何使addiction_type在表1中可用的第二個表(我只希望在addiction_type下列出的類型用作第一個表中的類型字段)

我是研究分析師,所以對數據庫設計一無所知期望我在網上讀到的東西。

+0

什麼DBMS?我們需要更多的實施信息。 – 2011-03-02 21:31:55

+0

你的問題是在第一個表中鍵入*作爲第二個表中的外鍵,第一個表中的每個表中有多個項目?當然,我們錯誤的方式,許多人可以有相同的成癮類型? – Mark 2011-03-02 21:33:46

回答

0

要做到這一點的方法是創建兩個不同的表,一個用於一個人,另一個用於藥物,然後使用第三個表來指示關聯(聯結)。

person Table 
------------- 

person_id ---primary key 
person_name 
person_age 
--other columns 

Drugs Table 
----------- 
Drug_id  --- primary key 
drug_name 
drug_type 
--other columns 


person_drug_asc 
------------------- 
person_drug_asc_id primary key 
person_id --foreign key from person table 
drug_id --foreign key from drug table 

該要求的原因是每個人可能與多種藥物相關聯,每種藥物可能與多個人相關聯。所以將外鍵放在任何一個表中都不會讓你對上述兩種情況建模。

要獲得每人的藥物類型,可以使用以下查詢。

select 
    from person per, 
     drugs dru, 
     person_drug_asc pda 
    where per.person_id = pda.person_id 
    and dru.drug_id = pda.drug_id 
    and per.person_name = '<name of the person>' -- or any other way to identify the person 

這會給你列出一個人上癮的所有類型的藥物。

+0

我能否看到一些評論,爲什麼這篇文章是downvoted? – 2011-03-02 21:46:46

+0

原始問題在哪裏談論有關學生的事情?這個簡單的關係不需要第三張表。 – ajdams 2011-03-02 21:48:24

+0

對不起......我應該把這個表格命名爲Persons。我對OP提到研究和機構感到困惑。現在糾正它。 – 2011-03-02 21:51:16

0

我會做到以下幾點:

第一個表(人民和他們的癮):
重點名稱成癮
1,瑪麗,酒精
2,喬,軟性藥物
3,吉姆,硬性藥物

對於第二個表格(成癮查找):
成癮例子
酒精,(啤酒,伏特加,朗姆酒等)
軟性毒品,(Ibprufen,Nyquil等)

我會把一個主鍵上的成癮列第二個表,然後你可以使第一個表中的Addiction字段爲{FK}(不是必須的,我建議只是將代理或假數字鍵作爲主鍵。

+0

如果喬對啤酒和Nyquil都上癮,會怎麼樣? – 2011-03-02 21:55:05

+0

然後,他會在那裏兩次......一個記錄看起來像[Joe,Alcohol]和另一個[Joe,Soft Drugs]每個都帶有不同的代理鍵。 – ajdams 2011-03-02 22:48:45

0

成癮類型表(或查找表)應該包含所有獨特的成癮類型。這樣,第一個表中的類型字段可以在第二個表中查找成癮類型。這被稱爲一對多關係。

嚴格地說,在第一個表中使用一個外鍵的ID字段是一種很好的做法。然而,爲了您在MS訪問中的目的,在第二個表的addiction_type(text)字段上簡單地創建一個主鍵(實質上強制該字段是唯一的)可能會更容易。由於上癮類型的第二個表中只能有一個唯一條目,因此如果需要進一步查找,示例必須是(文本)列表或分隔到另一個表中。

0

您無法創建引用具有非唯一值的列的外鍵約束。

另外,這是錯誤的想法。你有一個叫做沉迷型的概念,每種類型都有一組人和一組例子。這意味着一個表名爲主鍵(迄今爲止唯一的列)的成癮類型表,以及另外兩個具有引用它的外鍵約束的表。

您可能會認爲成癮類型表是多餘的,因爲它隱含在示例列表中,但如果您嘗試在關係數據庫系統中完成這項工作,則您正在進入一個痛苦的世界。