Php 数据库中标签的处理
我的网站包含视频和标签,我不知道如何将整个内容存储在数据库中。 我试着这样做:Php 数据库中标签的处理,php,mysql,Php,Mysql,我的网站包含视频和标签,我不知道如何将整个内容存储在数据库中。 我试着这样做: Table: Videos Columns: video_id, title, tagsList Indexes: video_id Table: Tag Columns: video_id, tagTitle Indexes: video_id, tagTitle 问题是我有超过10万个视频,每个视频都有大约10个标签,所以我的标签表有1百万行。因此,如果我想打印所有标签以及每个标签的视频量,这需要花费不合理的
Table: Videos
Columns: video_id, title, tagsList
Indexes: video_id
Table: Tag
Columns: video_id, tagTitle
Indexes: video_id, tagTitle
问题是我有超过10万个视频,每个视频都有大约10个标签,所以我的标签表有1百万行。因此,如果我想打印所有标签以及每个标签的视频量,这需要花费不合理的时间。创建一个透视表。你有这样的东西吗
Table: Videos
Columns: video_id, title, tagsList
Indexes: video_id
Table: Tag
Columns: tag_id, tagTitle
Indexes: tag_id
Table: video_tag
Columns: video_id, tag_id
Indexes: tag_id,video_id
然后将视频上的列标记为外键,并引用每个表上的列通过使数据修改稍微慢一点,始终可以加快查询速度:) @T alagbe的答案中的一个好处是,如果连接器表只包含2个ID字段,那么它的内存占用就很低。但我认为这还不够 我将用字段扩展连接器表,通过该字段可以对视频进行排序。例如,如果视频按添加日期排序,则:
CREATE TABLE `video_tag` (
`video_id` int not null,
`tag_id` int not null,
`added` datetime not null,
INDEX `main` (`tag_id` asc, `added` asc),
INDEX `video` (`video_id` asc)
);
请注意,重要的是综合指数“main”。您甚至可以从此表中删除其他索引。您可以有多个这样的表,但是每次有人添加或删除视频时,您都必须更新它们。
同样可以加速这种情况的是稀疏索引。但是MySQL(AFAIK)不支持这些
更新:你还可以考虑的是缓存视频列表以进行特定的过滤。这些可以通过crontab任务每10-30分钟更新一次。
首先,我们必须定义问题。因此,我看到两个问题
创建表“视频标签”(
`视频_id`int不为空,
`tag_id`int不为空,
`添加了`日期时间不为空,
索引'main'('tag_id'asc,'added'asc),
索引'video'('video_id'asc)
);
这里的情况是要有一个好的索引,它将尽可能快地为您提供信息
- 首先,我想问自己,我可以预加载几个标签,然后点击
按钮或其他什么东西加载更多标签。获取所有标签并不方便,因为用户/系统当时无法读取所有标签more
- 如果获取所有标签的性能不可接受,我是否使用可靠的技术来实现这一点?也许用mongo数据库()存储所有标记可以在这方面提供更好的性能
- 如果我需要计数器,我会使用物化视图,当我可以继续所有由事件触发的聚合过程(将标签添加到电影等)存储在该视图中时,无需在运行时计算所有计数器
创建表“mv\U电影\U标签\U计数器”(
`视频_id`int不为空,
`count`int不为空,
索引'video'('video_id'asc)
);
并在事件上更新计数器:从电影中添加/删除标记。所以可以通过mysql触发器自动触发
我不明白为什么您需要视频表中的
标记列表
列?而是添加一个单独的链接表,其中包含标记id和视频id之间的链接,然后删除将标记
表更改为标记id
和标记标题
或类似内容。若要增加加载时间,您可能不应该一次加载100k视频?可能想查看@Cyclone我不会一次加载100k,但显示标签列表和每个标签的视频量需要我扫描所有表格。这有什么不同?表video_标记将包含videos*标记行数,就像我的实现一样。不是吗?更正:视频数量*每个视频的平均标记数量。您有一个n:m关系。一个视频可以有多个标记,并且一个标记位于多个视频中。因此,您不用直接在视频表中写入标记,而是使用关系定义一个新表。然后,您可以抓取视频的所有标记(从Video_Tag中选择Tag_ID,其中Video_ID=x),您可以轻松抓取带有该标记的所有视频ID:(从Video_Tag中选择Video_ID,其中Tag_ID=x)我现在所做的工作如何更有效?。我不明白你的第一句话,你能说得更详细些吗?:)
DELIMITER $$
CREATE TRIGGER inc_tags_counter AFTER INSERT ON video_tag
FOR EACH ROW
BEGIN
UPDATE mv_movies_tags_counter SET count = count + 1 WHERE video_id = NEW.video_id;
END $$
DELIMITER ;
DELIMITER $$
CREATE TRIGGER inc_tags_counter AFTER DELETE ON video_tag
FOR EACH ROW
BEGIN
UPDATE mv_movies_tags_counter SET count = count - 1 WHERE video_id = NEW.video_id;
END $$
DELIMITER ;