0

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

产品:[id,名称]

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

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

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

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

那么它是错误的,因为如果我们的表的样本数据如下所示:

产品: [ 1, "椅子" ], [ 2, "桌子" ]

客户:[1、1、“安东尼·奎恩”]、[2、2、“玛丽莲·梦露”]

问题:[ 1, 1,“对这个产品有什么建议吗?” ], [ 2, 1, “你觉得这把椅子怎么样?” ]

那么可能会有一个包含以下数据的行:

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

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

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

没关系,但顺便说一句,我正在使用 mysql 来解决这个问题。

4

5 回答 5

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)
于 2012-10-15T17:20:34.320 回答
2

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

这是一个快速设计,它从表中删除代理键,其中代理键的存在使得执行参照完整性变得更加困难。关键的变化是 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 的一部分感到不舒服(特别是因为内容可能会改变),您可以在此处重新引入代理键,或者更好地添加一列 QuestionNo 到在单个产品中提供问题排序;然后将 ProductID, QuestionNo 设为主键和外键。

于 2012-10-15T17:31:12.557 回答
2

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

在此处输入图像描述

于 2012-10-15T17:37:09.597 回答
0

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

于 2012-10-15T17:21:30.233 回答
0

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

于 2012-10-15T17:30:37.790 回答