1

私のデータベースの知識は合理的です。これにはMySQL(InnoDb)を使用しており、Postgresの作業も行っています。ともかく...

  • はいまたはいいえの質問がたくさんあります。
  • 多数の人々が同じ投票に貢献することができます。
  • ユーザーはどちらかのオプションを選択でき、これはデータベースに記録されます。
  • ユーザーは後で気が変わって、保存されているデータの更新が必要になる選択肢を入れ替えることができます。

このデータを保存するための私の現在の計画:

  • POLLID、USERID、DECISION、TIMESTAMP

明らかに、ユーザーデータは別のテーブルにあります。

彼らの選択肢を追加するには、彼らが以前に投票したかどうかを確認するためにクエリを実行し、挿入する必要があります。そうでない場合は、更新します。投票結果を確認したい場合は、誰かが投票を確認するたびに、すべての決定(インデックス付きの部分ではありますが)を繰り返す必要があります。

私の質問は

  1. これを保存/クエリするためのより効率的な方法はありますか?
  2. POLLID、またはPOLLID&USERID(おそらく一意の制約)にインデックスを付けますか?または他?
  3. 追加の副次的な質問:Postgresの場合のように、テーブルでHASHインデックスとBTREEインデックスを選択するオプションがないのはなぜですか?
4

1 に答える 1

1

デザインは良さそうです、いくつかのアイデア:

投票の表:投票ID、質問。

選択肢の表:選択肢ID、テキスト。

投票を選択肢にリンクするための表:投票ID->選択ID。

ユーザーの表:ユーザーの詳細、ユーザーID。

投票テーブル:(ユーザーID、投票ID)、選択肢ID、タイムスタンプ。(括弧は一意のペアです)

ユーザーIDとポーリングIDのエントリが存在するかどうかを確認できるため、1人のユーザーの挿入/更新は正常に機能します。

COUNTを使用して反復処理するよりも、はるかに簡単に結果を表示できます。

e.g.: SELECT COUNT(*) FROM votes WHERE pollid = id AND decision = choiceid

これは、世論調査「pollid」で「choiceid」に投票した人の数を示しています。

後期編集:

これは、存在しない場合は挿入し、存在する場合は更新する方法です。

IF EXISTS (SELECT * FROM TableName WHERE UserId='Uid' AND PollId = 'pollid')
    UPDATE TableName SET (set values here) WHERE UserId='Uid' AND PollId = 'pollid'
ELSE   
    INSERT INTO TableName VALUES (insert values here)
于 2012-09-17T13:46:09.483 に答える