2012-10-15 89 views
1

問題定義:一家公司想通過詢問一些問題來衡量其產品的客戶滿意度。公司的產品數據存儲在「產品」表中,每個產品的客戶數據存儲在「客戶」表中,並且每個產品的問題存儲在問題表中。作爲簡單如下:基本數據庫設計場景

產品:[ID,名稱]

客戶:[ID,PRODUCT_ID(FK),名字]

問題:[ID,PRODUCT_ID(FK),文本]

問題是,我們如何設計一個表來存儲每個客戶的答案,通過考慮每個客戶只能回答其產品的問題。例如,如果你的答案是這樣的:

customer_answer:[ID,CUSTOMER_ID(FK),question_id(FK),答案]

那麼它錯了,因爲如果我們的表的樣本數據如下所示:

產品:[1, 「椅子」],[2, 「表」]

客戶:[1,1, 「安東尼·昆」],[2,2,「瑪麗蓮夢露「]

問題:[1,1,「該產品的任何建議?」 ],[2,1,「你估計這把椅子怎麼樣 ?」 ]

可能一個可能的排具有低於數據:

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

這是錯誤的,因爲id#2的客戶沒有product_id#1,所以對於這個問題可能是錯誤的表格。

在這種情況下我們能做些什麼?

它沒關係,但順便說一句我正在使用mysql來解決這個問題。

+0

您驗證數據錄入。 –

+0

客戶只能對產品提問一次嗎?如果他們在一個日期訂購產品,並且對此感到滿意,但是稍後再訂購併且遇到問題會怎麼樣? – LittleBobbyTables

+0

@LittleBobbyTables:在這個問題中無關緊要。 – linker

回答

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爲主鍵和外鍵。

+0

問題是,每個客戶只有1個產品。這個問題呢? – linker

+0

啊,這更容易(很難相信,但更容易;-))。擺脫CustomerProducts並將ProductID及其外鍵移回給客戶。然後,在客戶(CustomerID,ProductID)上創建一個新的UNIQUE INDEX。最後,引用CustomerProducts的Answers中的FK現在應該說'REFERENCES Customers(CustomerID,ProductID)'。 –

+0

好的,很好。我想知道Vikdor的答案是什麼問題?你的答案的優點是什麼? (你的回答也是正確的) – linker

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) 
+0

可以請你重寫customer_answer表嗎? – linker

+0

請參閱alter table語句的更新以強制執行外鍵關係。 – Vikdor

0

我想這應該是應用數據層(在MVC架構實例模型)插入數據前進行必要的檢查工作。

+0

我知道我們可以在我們的業務層進行檢查,但我想知道有沒有辦法在我的應用程序的「數據層」中執行此操作? – linker

+1

爲什麼地球上會有目的地建立一個數據庫,*忽略*數據庫強制引用完整性的能力? –

0

或者,您可以嘗試在插入「customer_answer」時嘗試編寫一個MySQL觸發器,它將檢查您試圖添加的新組合(產品ID和客戶ID)是否存在於客戶表中,如果是,則繼續,如果不是,你可以恢復。

2

注2個FKS上CustomerQuestion表:FK1 {CustomerID, ProductID}和FK2 {ProductID, QuestionID}

enter image description here

+0

在CustomerProduct表中有一個問題,即每個客戶只有一個產品,我們不能爲客戶添加2個產品 – linker

+0

@linker - 不太明白。這是一個規格,客戶只能有一個產品? –

+0

是的,我認爲Larry的回答是我正在尋找的。真的非常感謝你的回答,我從你的答案中學到了新東西。你的也是對的。 (他們是一樣的) – linker