我正在视频门户上做一个项目。在那,我正在尝试建立一个目前观看视频的地方。为了吸引目前正在观看该视频的人,我设计了一个这样的表:
表:(列)
斯诺
视频ID
会话ID
用户ID
createddate
这些是专栏,但我认为这还不够。如果可能,你能帮助我吗?我该如何设计桌子?我们如何才能完美呈现当前观看的视频?
请帮帮我。谢谢。
答案 0 :(得分:0)
一般来说,我会推荐类似于以下的模型:
<强>表格强>
[User]和[Video]的列将包含特定于每个实体的属性,例如“createdate”。 [VideoView]表格为link table,其中包含以下列:
<强>列强>
由于您可能有访问者“下载”,用户在以编程方式存储VideoD的EndDate之前关闭其浏览器,您可能希望对数据进行后处理以更新EndDates具有null值价值&lt; VideoView.StartDate + Video.Length&gt;使用更新语句和计划任务。
目前观看的视频可以使用SQL查询:
select * from VideoView
where StartDate <= getdate()
and isnull( EndDate, getdate() ) >= getdate()
希望有所帮助
答案 1 :(得分:0)
你的设计很好看。我会添加两个字段:
beginView : DATETIME (not NULL)
endView : DATETIME
当您开始流式传输视频时,您可以使用userid,sessionid,videoid,beginView时间和视频打开时间向表中添加新行(假设当前时间,除非您有其他可用信息。 )我假设Sno是一个标识列,您可以通过调用来插入行。此ID存储在会话中。当会话关闭时,可以通过更新endView值来关闭所有打开的记录 - 它们不再是“当前”视图。
要查找当前行,请使用WHERE子句
WHERE endView IS NULL.
endView中的NULL值表示视频仍在观看中。
通过常见的浏览器行为,视频会流式传输到客户端,通常比查看视频要快得多。要准确报告视频何时不再被观看,您可以安排浏览器发回视频已完成的通知。
您可能想要考虑用户长时间点击暂停按钮时会发生什么。他们还在看那个视频吗?
请注意,除非您在门户网站中明确禁止该视频,否则同一用户可能会同时观看多个视频,可能是相同的视频,并且根据您的会话管理情况,它们可能会出现在相同的视频下会话。这会影响用于存储会话中正在查看的视频的数据结构。
为了确保合理的性能,我会在videoid和endView上添加索引。这将支持查询正在观看特定视频的人,例如
SELECT [DISTINCT] userid FROM VideoView where videoid=? AND endView IS NULL.
DISTINCT标志严格正确,但这仅适用于同一用户多次查看视频的情况。它可以减慢查询速度,因此可以对重复数据删除的成本进行分析和权衡。
在启动时,您可能希望运行更新查询,将endView设置为endView为NULL的行的startView。如果会话未正确关闭服务器端(例如,应用服务器崩溃),就会发生这种情况。