基础数据库设计方案

时间:2012-10-15 17:14:51

标签: mysql sql database database-design

问题定义:公司希望通过提出一些问题来衡量客户对其产品的满意度。公司的产品数据存储在“产品”表中,每个产品的客户数据存储在“客户”表中,每个产品存储在问题表中的问题。简单如下:

  

产品:[id,name]

     

客户:[id,product_id(fk),name]

     

问题:[id,product_id(fk),text]

问题是,我们如何通过考虑每个客户只能回答其产品的问题来设计一个表来存储每个客户的答案。例如,如果您的答案是这样的:

  

customer_answer:[id,customer_id(fk),question_id(fk),answer]

然后错了,因为如果我们的表的样本数据如下:

  

产品:[1,“椅子”],[2,“表”]

     

客户:[1,1,“Anthony Quinn”],[2,2,“Marilyn Monroe”]

     

问题:[1,1,“有关此产品的任何建议吗?” ],[2,1,“如何   你估计这把椅子吗?“]

然后可能可能包含以下数据的行:

  

customer_answer:[1,2,1,'不,谢谢']

这是错误的,因为身份#2的客户没有product_id#1,所以这个问题可能是错误的表。

在这种情况下我们能做些什么?

没关系,但BTW我正在使用mysql来解决这个问题。

5 个答案:

答案 0 :(得分:2)

您应该在customer_answer表中的customer_id和product_id上定义外键约束,引用customer表中的id和product_id列,以强制存储仅针对客户问题的答案。

CREATE TABLE customer_answer
(
    id  INT,
    customer_id INT,
    product_id INT, 
    answer VARCHAR(128),
)
ALTER TABLE customer_answer
ADD CONSTRAINT FK_Customer_Answer_To_Customer FOREIGN KEY (customer_id, product_id) REFERENCES customer(id, product_id)

答案 1 :(得分:2)

这是代理键损坏而不是帮助您的数据库设计的情况。此外,您可能应该有一个单独的Customers表来唯一列出客户。

这是一个快速设计,它从表中删除代理键,其中代理键的存在使得强制引用完整性变得更加困难。关键的变化是CustomerProducts(我已经重命名为您的Customers表)现在使用CustomerID,ProductID作为PRIMARY KEY,从而可以强化答案和所拥有产品之间关系的完整性。

 Products:         ProductID, Name 
                       (PK = ProductID)
 Customers:        CustomerID, Name 
                       (PK = CustomerID)
 CustomerProducts: CustomerID, ProductID 
                       (PK = CustomerID, ProductID)
                       (FK = CustomerID REFERENCES Customers)
                       (FK = ProductID  REFERENCES Products)
 Questions:        ProductID, QuestionText 
                       (PK = ProductID, QuestionText)
                       (FK = ProductID REFERENCES Products)
 Answers:   CustomerID, ProductID, QuestionText 
                       (FK CustomerID, ProductID REFERENCES CustomerProducts)
                       (FK ProductID, QuestionText REFERENCES Questions)

注意:如果您使用大型VARCHAR字段QuestionText作为问题PK和FK on Answers的一部分感到不舒服(特别是因为内容可能会更改),您可以在这里重新引入代理键,或者更好的是,添加一个专栏问题无需在单个产品中提供问题排序;然后生成ProductID,QuestionNo主键和外键。

答案 2 :(得分:2)

注2 CustomerQuestion表上的FK:FK1 {CustomerID, ProductID}和FK2 {ProductID, QuestionID}

enter image description here

答案 3 :(得分:0)

我认为这应该是应用程序数据层(例如MVC架构中的模型)的工作,以便在插入数据之前进行必要的检查。

答案 4 :(得分:0)

或者您可以尝试在插入“customer_answer”时编写MySQL触发器,这将检查您要添加的新组合(产品ID和客户ID)是否存在于customers表中,如果是,则转到如果没有,你可以恢复。