0

問題の定義:企業は、いくつかの質問をすることによって、製品の顧客満足度を測定したいと考えています。会社の製品データストアは「製品」テーブルに、各製品ストアの顧客データは「顧客」テーブルに、各製品ストアの質問は質問テーブルにあります。以下のように簡単です:

製品:[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、 "アンソニークイン"]、[2、2、"マリリンモンロー"]

質問:[1、1、「この製品に関する提案はありますか?」]、[2、1、「この椅子をどのように推定しますか?」]

次に、以下のデータを含む可能性のある行がある可能性があります。

customer_answer:[1、2、1、'いいえ、ありがとう']

これは間違っています。ID#2の顧客はproduct_id#1を持っていないため、この問題のテーブルが間違っている可能性があります。

そのような状況で私たちは何ができるでしょうか?

それは問題ではありませんが、ところで私はこの問題を解決するためにmysqlを使用しています。

4

5 に答える 5

2

customer テーブルの id 列と product_id 列を参照して、customer_answer テーブルの 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

これは、代理キーがデータベースの設計に役立つどころか、悪影響を与えるケースです。また、顧客を一意にリストするために別の 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 の一部として使用することに抵抗がある場合 (特に内容が変更される可能性があるため)、ここで代理キーを再導入するか、列 QuestionNo を追加することをお勧めします。単一の製品内で質問の順序を提供します。次に、ProductID、QuestionNo を主キーおよび外部キーにします。

于 2012-10-15T17:31:12.557 に答える
2

Note 2 FKs on CustomerQuestion table: FK1 {CustomerID, ProductID} and FK2 {ProductID, QuestionID}

enter image description here

于 2012-10-15T17:37:09.597 に答える
0

または、「customer_answer」の挿入時に MySQL トリガーを作成してみてください。追加しようとしている新しい組み合わせ (製品 ID と顧客 ID) が顧客テーブルにあるかどうかを確認します。元に戻すことはできません。

于 2012-10-15T17:30:37.790 に答える
0

これは、データを挿入する前に必要なチェックを行うアプリケーション データ レイヤー (たとえば、MVC アーキテクチャのモデル) の仕事であるべきだと思います。

于 2012-10-15T17:21:30.233 に答える