你想要的解決方案實際上取決於你的數據,而且這個問題以前曾經有過數千次的問題。如果你google Entity Attribute Value vs strict relational model你會看到無數的文章 比較和對比可用的方法。
嚴格的關係模型
你會增加額外的BIT
或DATETIME
場(其中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和資源比關係模型密集,但整體結構更加靈活。
所以總結一下,這真的取決於你自己的具體情況,都需要考慮幾個因素,但也有很多的資源都來幫你決定。