1

私は最近、例を使って独学でデータベースをいじり始めました。

私は現在解決しようとしている次の問題を抱えています。これは私を混乱させます。誰かが光を当てることができることを願っています。

データベースには 4 つのテーブルがあります。写真家、写真、コンテスト、視聴者。コンセプトは、写真家がコンテストに参加することです。コンテストごとに 1 枚の写真を撮影し、視聴者が評価します。競争の勝者は、最も多くのポイントを獲得した人です。以下の制限を設けました。

  1. 評価は 0 ~ 5 です
  2. 先着20名の視聴者のみが投票できます
  3. 派生値の計算方法を学びたいので、写真家の合計評価を保存したくありません。

番号 1 と 2 については、この制約を明示的に作成する方法がわかりません。番号 3 については、db で派生値を表す方法がわかりません。MySqlを使用しています

ご意見、アドバイスをいただければ幸いです。

よろしくお願いします

4

2 に答える 2

1

1] 私の知る限り、MySQL でそのような制約を直接設定することはできません。0 ~ 255 の許容値で使用できますが、値をデータベースに挿入する前にUNSIGNED TINYINT値が適切かどうかを自分で確認する必要があります。

2] 1 枚の写真につき最大 20 票のみを許可したいということを正しく理解していますか?

すべての投票を別の場所に保存する (次に、既に存在する投票数を確認する) か、平均と投票数だけを保存する必要があります。いずれにせよ、これを自分で確認し、ユーザーに投票を許可するかどうかを決定する必要があります。最初のオプションの場合:

SELECT COUNT(*) > 20 FROM votes
WHERE picture_id = '123'

2番目はさらに簡単です:

SELECT votes_count > 20 FROM pictures
WHERE id = '123'

3] 写真データベースに直接保存された写真に投票した場合は、単純に SUM() 関数を使用します。

SELECT *, SUM(points) as total_points FROM photographers AS ph
LEFT JOIN pictures AS pic ON pic.photographer_id = ph.id
GROUP BY p.id, competition_id

私はそこで間違いを犯さなかったことを願っています。より詳細な質問がある場合は、質問してください。穴を埋めようとします ;)

于 2011-03-09T21:36:12.093 に答える
1

1)enum値を見てください。ただし、tinyint(1) unsignedより高速な場合があります

于 2011-03-09T21:39:29.407 に答える