Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/284.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/69.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/xamarin/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 数据库中标签的处理_Php_Mysql - Fatal编程技术网

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分钟更新一次。

首先,我们必须定义问题。因此,我看到两个问题

  • 数据库结构
  • 访问信息的性能

  • 对于数据库,您可以实际为kitten发布的标记集合创建透视表
    
    创建表“视频标签”(
    `视频_id`int不为空,
    `tag_id`int不为空,
    `添加了`日期时间不为空,
    索引'main'('tag_id'asc,'added'asc),
    索引'video'('video_id'asc)
    );
    

    这里的情况是要有一个好的索引,它将尽可能快地为您提供信息

  • 关于获取基本信息:

    • 首先,我想问自己,我可以预加载几个标签,然后点击
      more
      按钮或其他什么东西加载更多标签。获取所有标签并不方便,因为用户/系统当时无法读取所有标签
    • 如果获取所有标签的性能不可接受,我是否使用可靠的技术来实现这一点?也许用mongo数据库()存储所有标记可以在这方面提供更好的性能
    • 如果我需要计数器,我会使用物化视图,当我可以继续所有由事件触发的聚合过程(将标签添加到电影等)存储在该视图中时,无需在运行时计算所有计数器
  • a) 作为结论,关于你的信息。我会预加载一些标签,然后在需要时获取更多。 b) 我将创建物化视图。桌子

    
    创建表“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 ;