0

前回のデータベース クラスからしばらく経ちましたが、プレイリストを含むビデオ データベースである PHP/MySQL アプリケーションの次の基本的なデータベース設計についていくつか質問があります。

t_playlists
p_id (PK) | name | description

t_videos
v_id (PK) | name | description | playcount

t_mapping
v_id (FK) | p_id (FK)

実行したいクエリは次のとおりです。

  • すべてのプレイリストを取得します - 各プレイリスト内のビデオの数を含みますが、ビデオ自体は含みません
  • を指定するとp_id、そのプレイリスト内のすべての動画を取得します
  • が与えられたv_id場合、このビデオが属するプレイリストを取得します

現在、1 つの動画は 1 つのプレイリストにのみ属することができます。

今私の質問に:

  1. このような場合に、なぜマッピング テーブルを使用するのか思い出していただけますか? それが「良い習慣」であることは覚えていますが、その理由は正確には思い出せません。p_idに別の列 (FK)を含めるよりも、別のマッピング テーブルを使用する方が「優れている」のはt_videosなぜですか? それは私のクエリをもっと簡単にしないでしょうか?
  2. 同じことを達成するより効率的な設計はありますか?
  3. 説明した 3 つのケースの SQL クエリは何ですか? (私はMySQLを使用しています)
4

1 に答える 1

1
  1. 現在、動画と再生リストの間に 1 対多の関係がある場合は、t_videos に p_id (FK) を含めるだけでマッピング テーブルを作成する必要はありません。多対多の関係を持つ場合は、マッピング テーブルが必要になります。あなたの場合は1対多であるため、t_videosテーブルにp_idがあるとクエリが簡単になるため、あなたは正しいです。

  2. 私が言ったように、多対多でない限り、マッピング テーブルは必要ありません。より効率的な設計に関して言えば、あなたが持っているコンセプトは非常に単純であり、設計も同様です。それよりも効率的になるかどうかはよくわかりません。

3.最初のものは、ビデオの数を取得するためにネストされたステートメントが必要なので、次のようになります。

SELECT "name", description, (SELECT COUNT(*) FROM t_videos WHERE fk_p_id = p_id) AS VideoCount FROM t_playlists      

これにより、各プレイリストの数が VideoCount という列に表示されます

SELECT * FROM t_videos WHERE fk_p_id = given_p_id 

(これは、マッピング テーブルを削除し、ビデオ テーブルに p_id を含めた場合です。

SELECT * FROM t_playlists 
INNER JOIN t_videos
ON t_playlists.p_id = t_videos.fk_p_id 
WHERE v_id = given_v_id  

簡単にするために、列名の代わりに * を付けていることに注意してください。ただし、表示する列名のみを含める必要があります。

編集:これはすべて、あなたが述べた1対多があると仮定しています。ただし、関係は多対多であるべきだと私には思えます。

于 2012-04-12T12:38:23.237 に答える