你想要的解决方案实际上取决于你的数据,而且这个问题以前曾经有过数千次的问题。如果你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和资源比关系模型密集,但整体结构更加灵活。
所以总结一下,这真的取决于你自己的具体情况,都需要考虑几个因素,但也有很多的资源都来帮你决定。