-1

投票用の Web サイトを作成しました。ユーザーは登録して投票することを意図しています。ユーザーの情報とコメント用にテーブルを 1 つだけ作成しました。以下は、テーブルの列と行です。

ユーザー:

columns:   username password agree_1 reason_1 agree_2 reason_2

rows:      paul     testing   yes     NULL     no      because i don't like it

ここのメンバーから、次のようにテーブルを再構築する必要があるというアドバイスを受けました。

users
- id
- email
- name

polls
- id
- name

questions
- id
- poll_id
- question
- order

answers
- id
- question_id
- user_id
- answer

どの列が主キーで、どの列が外部キーか教えてください。あるテーブルが別のテーブルにどのように関連しているかを知る必要があります。助けてください。ありがとう

4

3 に答える 3

2

多くの場合、「id」はその特定のテーブルの主キーであり、 table1name_idはそのテーブルを table1 に関連付けるそのテーブルの外部キーです。

たとえば、あなたの例では、各テーブルのidはそのテーブルの主キーであり、「質問」テーブルと投票「テーブル」を関連付けるテーブルpoll_idの外部キーです。questions

于 2013-01-21T04:36:12.680 に答える
1

技術的には、両方のアプローチを使用できます。

問題は、再利用の問題に要約されます。このサイトを追加の世論調査に使用するつもりなら、あなたの同僚のアプローチは正しいです。

ただし、これが単発タイプの取引である場合は、最初から何を始めても問題ありません。

あなたのアプローチにより、コード/セットアップが大幅に少なくなります。EAV モデルの複雑さを理解するには、もう少し時間がかかります。特に報告に関して。EAV 設計を使用してパフォーマンスの高いクエリを構築することは、気弱な人向けではありません。

確かに中間点はあります。つまり、ログイン情報を独自のテーブルに分離し、関心のある 4 つの列だけを含む「投票」回答テーブルを作成します。このアプローチには、EAV アプローチのような柔軟性はありませんが、構造に関する標準的な DB 設計基準を満たし、まとめてクエリを実行するのは非常に簡単です。

最後に、4 番目のオプションがあります。自分で作成する代わりに、無料のポーリングを行うサイトの 1 つにサインアップするだけです。例: http://www.micropoll.com/ 注: 私は彼らと提携していませんし、彼らの製品を使用したこともありません。それは、2 秒の Google 検索でポップアップ表示されたサイトでした。


コメントによる更新はい、元の構造に対して簡単なクエリを実行できます。例えば:

  1. ユーザー数のカウント:
    select count(*) from users

  2. はいと答えた人の数を数えます: 同意するにははい
    _1:select count(*) from users where agree_1 = 'yes'
    両方にselect count(*) from users where agree_1='yes' and agree_2='yes'
    はい: どちらにも:select count(*) from users where agree_1='yes' or agree_2='yes'

  3. いいえと答えた人の数を数えます: 同意するには
    いいえ_1:select count(*) from users where agree_1 = 'no'
    両方にselect count(*) from users where agree_1='no' and agree_2='no'
    いいえ: どちらにもいいえ:select count(*) from users where agree_1='no' or agree_2='no'

  4. コメントのみを表示
    :select reason_1, reason_2 from users
    はいのみselect reason_1 from users where agree_1 = 'yes'

    select reason_1 from users where agree_1 = 'yes' union all select reason_2 as reason_1 from users where agree_2 = 'yes'

于 2013-01-21T04:40:13.857 に答える
0

データベースでリレーションシップを使用すると、データの検証と正規化が維持され、冗長なデータを保持しない構造を使用するようにしてください。その人は、開始するのに十分だと提案しました。テーブルに InnoDB エンジンを使用するだけです。ユーザー、投票、質問および回答テーブルで id をプライマリにし、外部キー列 (question_id、poll_id、user_id) にインデックスを追加します。地図

    answers.question_id to questions.id 
    questions.poll_id to polls.id
    answers.user_id  to users.id 

これは、phpmyadmin のリレーション ビューで簡単に実行できます。

于 2013-01-21T04:41:46.027 に答える