我有一个问题,我们有一个客户表包括姓名,电子邮件,地址和技能表,这是qts,急救与id相关联。例如
Customer
id = 1
Name = James
Address = some address
Skills
1, qts
2, first aid
我现在正试图配对这段关系。我首先通过创建一个只有customerId并且每个技能都具有真/假值的技能表来快速找到解决方案。然后在customer_skills和customerId之间创建了一个go to SkillId。但是,由于没有唯一的ID,我不知道在值发生变化时如何更新记录。
任何人都可以帮助解决最佳方法吗?
感谢....
答案 0 :(得分:3)
您想要的解决方案实际上取决于您的数据,并且这个问题之前已被问过数千次。如果你谷歌 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
与关系模型相比,这更加完善和资源密集,但整体结构更加灵活。
总而言之,这实际上取决于您自己的具体情况,有几个因素需要考虑,但有很多资源可以帮助您做出决定。
答案 1 :(得分:0)
如果您有一个表将两个其他表中的主键链接在一起以形成多对多关系(如您所示),则不必更新该表。相反,您可以删除并重新插入值。
如果您正在编辑客户(例如customerId 46)并更改该客户的技能,您可以删除客户的所有技能,然后在存储更改时重新插入新的技能。
如果您的“链接表”除了两个主键列之外还包含一些其他信息,那么情况可能会有所不同。但是根据您的描述,您似乎只想使用每个表中的主键将表链接在一起。在这种情况下,删除+重新插入应该没问题。
同样在这种表中,您应该将两个外键字段的组合作为绑定表的主键。