您想要的解决方案实际上取决于您的数据,并且这个问题之前已经被问过数千次。如果你用谷歌搜索
实体属性值与严格的关系模型,你会看到无数文章比较和对比了可用的方法。
严格关系模型
您将为每个技能添加额外的BIT
或DATETIME
字段(其中NULL
日期时间表示客户不具备该技能)到您的客户表中。如果您的技能很少随着时间的推移不太可能发生很大变化,那么这很有效。这允许简单的查询来定位具有技能的客户,尤其是具有各种技能组合的客户,例如(使用日期时间字段)
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
与关系模型相比,这更加复杂且资源密集,但整体结构更加灵活。
总而言之,这真的取决于你自己的具体情况,有几个因素需要考虑,但有很多资源可以帮助你做出决定。