你能用数据库做到这一点吗?


Can you do this with a database?

我将所有视频和每个视频的详细信息存储在数据库中。我有一些表:

  • 视频(视频详细信息、名称等)
  • video_file(每个视频以不同的比特率和不同的屏幕尺寸呈现)
  • 播放列表(将视频存储在预定义的播放列表中)

每个视频都有1080和720编码的文件,每一个都用三种不同的比特率编码,每一种比特率都用WebM和MP4编码。因此,每个视频条目在video_file中有六个条目。因此,我的查询每个视频返回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行,然后遍历每个视频获取注释,或者其他更好的方法?

我的问题到此结束,非常感谢您一直阅读这篇文章!

这样做的另一种方法是跨不同的列使用GROUP_CONCAT函数,并对重复的列进行分组。这将在输出中创建一个带分隔符的字符串列,您需要在PHP中解析该列;但是,它会将行计数减少到只有非分组列的唯一组合的数量。例如:

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

在上面的示例中,生成的delimited_pairs列将使用管道字符分隔每个名称/播放列表(分组列)的每个唯一列值,并且每个唯一组合将由正斜杠分隔。

我认为你的数据布局有问题。您的"冗余数据"不应该进入video_file表,而应该进入video表,因为它是指视频的信息,而不是指文件!这种数据库方案在一致性方面也很差,例如:如果要更新视频所属播放列表中的信息,则必须对所有文件进行更新。

相关文章: