2012-06-08 55 views
0

我有一個問題,我們有一個客戶表包括名稱,電子郵件,地址和一個技能表,這是QTS,與ID相關聯的急救技能。例如客戶技能數據庫設計

Customer 
id = 1 
Name = James 
Address = some address 

Skills 
1, qts 
2, first aid 

我現在正在嘗試配對關係。我首先通過創建一個只有customerId的技能表來快速解決問題,並且每個技能都具有真/假值。然後在customer_skill和customerId之間創建一個去SkillId。但是由於沒有唯一的ID,所以當值更改時我不知道如何更新記錄。

任何人都可以幫助什麼是最好的方式來做到這一點?

感謝....

回答

0

如果你有一個錶鏈接從其他兩個表的主鍵在一起,以形成(在你例子等)一個多一對多的關係,你不必更新該表。相反,您可以刪除並重新插入值。

如果您正在編輯客戶(例如customerId 46)並更改該客戶的技能,則可以刪除客戶的所有技能,然後在存儲更改時重新插入新的技能集。

如果您的「鏈接表」包含除了兩個主鍵列以外的其他信息,則情況可能會有所不同。但是從你的描述來看,你似乎只想使用每個表中的主鍵將錶鏈接在一起。在這種情況下,刪除+重新插入應該沒問題。

也在這種表中,您應該使兩個外鍵字段的組合成爲綁定表的主鍵。

3

你想要的解決方案實際上取決於你的數據,而且這個問題以前曾經有過數千次的問題。如果你google Entity Attribute Value vs strict relational model你會看到無數的文章 比較和對比可用的方法。


嚴格的關係模型

你會增加額外的BITDATETIME場(其中NULL日期時間表示不具有技能的顧客),每個技能 給客戶表。如果你有幾乎不可能隨時間變化很多的技能,這很好。 這樣簡單的查詢,找到客戶的技巧,特別是技能ee.g的各種組合(使用日期時間字段)

SELECT * 
FROM Customer 
WHERE Skill1 >= '20120101' -- SKILL 1 AQUIRED AFTER 1ST JAN 2012 
AND  Skill2 IS NOT NULL -- HAS SKILL 2 
AND  Skill2 IS NULL  -- DOES NOT POSSESS SKILL 3 

實體 - 屬性 - 值模型

這是一個對經典的實體 - 屬性 - 值模型進行輕微調整,因爲該值是由存在記錄表示的布爾值。 您可以創建一個表是這樣的:

CREATE TABLE CustomerSkills 
(  CustomerID  INT NOT NULL, 
     SkillID   INT NOT NULL 
    PRIMARY KEY (CustomerID, SkillID), 
    FOREIGN KEY (CustomerID) REFERENCES Customer (ID), 
    FOREIGN KEY (SkillID) REFERENCES Skills (ID) 
) 

您可能需要額外的列,如DateAdded,AddedBy等進行跟蹤時等加入,誰的技能,但核心原則可以從上面收集。 使用這種方法添加技能要容易得多,因爲它不需要添加列,但可以使簡單查詢變得更加複雜。上面的查詢將不得不寫爲:

SELECT Customer.* 
FROM Customer 
     INNER JOIN 
     ( SELECT CustomerID 
      FROM CustomerSkills 
      WHERE SkillID IN (2, 3) -- SKILL2,SKILL3 
      OR  (SkillID = 1 AND DateAdded >= '20120101') 
      GROUP BY CustomerID 
      HAVING COUNT(*) = 2 
      AND  COUNT(CASE WHEN SkillID = 3 THEN 1 END) = 0 
     ) skills 
      ON Skills.CustomerID = Customer.ID 

這是更爲complext和資源比關係模型密集,但整體結構更加靈活。


所以總結一下,這真的取決於你自己的具體情況,都需要考慮幾個因素,但也有很多的資源都來幫你決定。