0

すべてのビデオとそれぞれの詳細をデータベースに保存します。私はいくつかのテーブルを持っています:

  • ビデオ(ビデオの詳細、名前など)
  • video_file (各ビデオは、異なるビット レートと異なる画面サイズでレンダリングされます)
  • プレイリスト (定義済みのプレイリストにビデオを保存するため)

各ビデオには 1080 と 720 でエンコードされたファイルがあり、それぞれが 3 つの異なるビット レートでエンコードされており、これらのビット レートはそれぞれ WebM と MP4 の両方でエンコードされています。したがって、ビデオ エントリごとに video_file に 6 つのエントリがあります。したがって、クエリは動画ごとに 12 行を返します。

私が見る問題は、「必要な」情報だけでなく、各行にすべての情報が含まれていることです。例:

| id |   name   |    playlist    |   file   | quality | size | type |
---------------------------------------------------------------------
  1     video1      funny videos     file1      3        720    MP4
  1     video1      funny videos     file2      2        720    MP4
  1     video1      funny videos     file3      1        720    MP4
  1     video1      funny videos     file4      3        1080   MP4
  1     video1      funny videos     file5      2        1080   MP4
  1     video1      funny videos     file6      1        1080   MP4
  1     video1      funny videos     file7      3        1080   WebM
  1     video1      funny videos     file8      2        1080   WebM
  1     video1      funny videos     file9      1        1080   WebM
  1     video1      funny videos     file10     3        720    WebM
  1     video1      funny videos     file11     2        720    WebM
  1     video1      funny videos     file12     1        720    WebM

これは出力例です。はるかに効果的だと思うのは、結果をグループ化して、行ごとに冗長な情報が得られないようにすることです。結局のところ、この情報を PHP または使用している言語でグループ化して、それを使用できるようにすることになります。まったく。

より効果的だと私が信じるものの例:

| id |   name   |    playlist    |   file   | quality | size | type |
---------------------------------------------------------------------
  1     video1      funny videos     file1       3      1080    WebM
                                     file2                      MP4
                                     file3              720     WebM
                                     file4                      MP4
                                     file5       2      1080    WebM
                                     file6                      MP4
                                     file7              720     WebM
                                     file8                      MP4
                                     file9       1      1080    WebM
                                     file10                     MP4
                                     file11             720     WebM
                                     file12                     MP4

このようにして、列名に対応するいくつかの変数を簡単に設定できます。

id, name, playlist, file, quality, size, type

while (record = fetchRecord)
    id = record.id or id
    name = record.name or name
    playlist = record.playlist or playlist
    file = record.file or file
    quality = record.quality or quality
    size = record.size or size
    type = record.type or type

    // Now you have filled the variables with the exact information you had in the first recordset example, but without wasting so much unnecessary bandwidth and processing power. 

ここで、ビデオの再生中にポップアップするメモを含む別のテーブルを追加しているので、ビデオに x 数のメモがある場合、ビデオごとに 12x 行が返されます。

これは非常識です!私は何かを逃しましたか?ここで私が「説明」していることは実際に可能ですか?それとも、今日のように動画ごとに 12 行を返す 1 つのクエリを作成し、メモをフェッチする各動画を実行する方がよいでしょうか?

これで私の質問は終わりです、最後まで読んでくれてありがとう!

4

2 に答える 2

1

このようなことを行う別の方法はGROUP_CONCAT、異なる列全体で関数を使用し、繰り返される列でグループ化することです。これにより、出力に区切られた文字列列が作成され、PHP で解析する必要があります。ただし、グループ化されていない列の一意の組み合わせの数だけに行数が減ります。例えば:

select name, playlist, GROUP_CONCAT(file, '|', quality, '|', size, '|', type SEPARATOR '/') AS delimited_pairs
from video
group by name, playlist;

上記の例では、結果のdelimited_pairs列はパイプ文字を使用して名前/プレイリスト (グループ化列) ごとに一意の各列値を区切り、これらの一意の組み合わせのそれぞれはスラッシュで区切られます。

于 2013-05-31T15:44:04.367 に答える
0

データのレイアウトに問題があると思います。あなたの「冗長データ」はvideo_fileテーブルに入るべきvideoではありませんが、ファイルではなくビデオを参照する情報であるため、テーブルに入れるべきです! このデータベース スキームは、たとえば次のような場合、一貫性の点でも良くありません。ビデオが属するプレイリストの情報を更新すると、すべてのファイルに対してそれを行う必要があります...

于 2013-05-31T11:33:56.847 に答える