2012-06-08 53 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和资源比关系模型密集,但整体结构更加灵活。


所以总结一下,这真的取决于你自己的具体情况,都需要考虑几个因素,但也有很多的资源都来帮你决定。