2012-02-15 10 views
0

私は最初の良いサイズのプロジェクトを設計しています。私は正しい道にいると確信していますので、私はコミュニティによってそれを実行すると思っていました。同じテーブル内のブール値と文字列の値

私は企業に製品を提出するベンダーを持っています。ベンダーは、提出したい会社を選択します。これにより、会社が選択した質問のページが表示されます。これまでのところ、私は企業のテーブル、ベンダーのテーブル、製品のテーブルを持っています。それぞれ独自の主キーを持つ、簡単に十分です。私の問題は、新しい投稿ごとにそれらをまとめて結びつける投稿と呼ばれる私のテーブルです。私は、会社がすべて異なる質問をしたいので、1,000列の提出テーブルを持つことをやめようとしています。私は

Table Submissions 
    submission_id 
    date 
    product_id FK 
    vendor_id FK 
    company_id FK 

and 

Table Questions 
    question_id 
    question 

and to bridge the many to many 

Table Questions_Submissions 
    questions_submissions_id 
    submission_id FK 
    question_id FK 
    answer 

を持っている場合、これは正規化のための推奨パスだろうとそうそこがある場合は、列の答えを有する任意の害は、ブール、文字列の結果が含まれているか、私は何とか別のテーブルにブールの質問を破る必要がありますか?私は今後数年間で数百万行のデータを期待しており、最初からこの間違ったデザインをしてはいけないと確信したい。このデザインで眩しいエラーや赤い旗が見える場合は、ご意見ありがとうございます。

答えて

2

これまでのところ、私は企業のテーブル、ベンダーのテーブル、製品のテーブルを持っています。それぞれ独自の主キーを持つ、簡単に十分です。

各行には固有のID番号があります。それはあなたが関係を正規化することと全く同じではありません。リレーショナルデータベースで重要なのは、行を識別することではなく、行が表すものを識別することです。

ので、例えば、このテーブル

Table Questions 
    question_id 
    question 

は非常に簡単に次のようになり、データで終わることができました。

question_id question 
-- 
1   What is your name? 
2   What is your name? 
3   What is your name? 
4   What is your name? 
5   What is your name? 

各行は一意に識別されますが、各質問(重要なこと)は異なります。 {question}には一意の制約が必要です。

私は企業に製品を提出するベンダーがあります。

Table Submissions 
    submission_id 
    date 
    product_id FK 
    vendor_id FK 
    company_id FK 

あなたはどちらか{PRODUCT_ID、VENDOR_ID、のcompany_id}または{日付、PRODUCT_ID、VENDOR_ID、のcompany_id}上で一意制約を必要としています。

ベンダー製品の表も必要です。あなたのテーブルでは、ベンダーは、販売していないすべての製品を含むあらゆる製品を企業に提出することができます。

ベンダーは、彼らがに提出したい会社を選択し、それが会社によって選ばれた質問のページが表示されます。 (強調が追加されました)

あなたのスキーマには、会社が選択した質問は保存されていません。

列の答えを有する任意の害はあなたが文字列として任意の一般的なデータ型についてだけで表現することができ、ブール、文字列の結果

を含んでもあります。しかし、この構造では、ブール値を2つの値に制限することはできません。数値結果の可能性を追加した場合、その値も正常な値に制限することはできません。

+0

フィードバックいただきありがとうございます。私がコミュニティが提供できることを望んでいたのとまったく同じタイプの反応。 –

0

これは確かにそれについて行く一つの方法であり、それはかなり良いように見えます。

さまざまな種類の回答を処理するために、質問内の答えといくつかのif文を使って賢明なことをすることはできますが、解決策はいくらか複雑になります。回答。

ブール型では、varcharフィールドに "true"または "false"を指定するだけで簡単に取り除くことができます。数値または日付の回答を取得する必要がある場合は、問合せで直接合計または平均を求めて、回答をタイプに分割できます。

+0

ありがとうBrian。ブール値が文字列と文字列を取るスペースが考慮されるべきかどうかはわかりませんでした。ディスクスペースが安いので、大したことではないと思ったら、あとで変換のコード行を避けるために、真/偽、はい/いいえにします。 –

関連する問題