Mysql “查看此项目的用户也查看了…”的数据库

Mysql “查看此项目的用户也查看了…”的数据库,mysql,mongodb,database-design,relational-database,database,Mysql,Mongodb,Database Design,Relational Database,Database,我想创建一个功能“谁查看了这个项目也查看了”像亚马逊或易趣。我决定在MySql和非关系数据库(如MongoDB)之间进行选择 编辑:在MySql中实现此功能似乎很简单。我猜是在创建“已查看”表,其中保存了userId、itemId和查看时间。因此,当尝试推荐用户正在查看的当前项目时,我会Sub=从查看中选择userId,其中itemId==currentItemId,然后在viewsed.userId=Sub.userId上从查看的内部连接Sub中选择itemId 对于本月浏览100页的1000

我想创建一个功能“谁查看了这个项目也查看了”像亚马逊或易趣。我决定在MySql和非关系数据库(如MongoDB)之间进行选择

编辑:在MySql中实现此功能似乎很简单。我猜是在创建“已查看”表,其中保存了userId、itemId和查看时间。因此,当尝试推荐用户正在查看的当前项目时,我会Sub=从查看中选择userId,其中itemId==currentItemId,然后在viewsed.userId=Sub.userId上从查看的内部连接Sub中选择itemId

对于本月浏览100页的100000用户来说,这不是太多了吗

对于非关系数据库,我认为让用户嵌入所有用户或让项嵌入所有用户是不对的。所以,我想让每个用户都拥有一个他查看的itemid列表,每个Item都拥有一个他查看的userid列表。我不知道下一步该怎么办。我走的路对吗


如果不是,您能建议一种在非关系数据库中实现此功能的好方法吗?而且,与MySql相比,这个建议在速度上有优势吗?

这可能更多地取决于您如何实现此功能,而不是所使用的数据库类型

如果您只是存储了很多查看历史记录,比如用户x查看了项目y,那么您必须先查看查看项目的用户,然后再查看这些用户查看的所有项目。这一切都可以在单个数据库表上完成。但是,最终可能会产生非常大的结果集

使用连接项的图形结构可能更容易,这些连接项在运行时不断更新,然后很容易查询。

初始响应 在MySql中实现这一特性似乎很简单,只需在Item和User表上调用JOIN

但是,要一次收集100000个用户的全部浏览历史,数据库调用的速度是快还是慢

一根绳子有多长

这取决于关系数据库实现的标准和质量。如果您的所有文件上都有ID字段,那么它就不会有关系完整性、能力或速度,而是会有1970年的ISAM记录归档系统速度

在Sybase ASE服务器上,在一个小Unix框中,对一个表(而不是一个有160亿行的文件)进行类似的选择,会在12毫秒内返回100行

对于非关系数据库,我认为让用户嵌入所有用户或让项嵌入所有用户是不对的。所以,我想让每个用户都拥有一个他查看的项目ID列表,每个项目都拥有一个他查看的用户ID列表

我不能回答你的问题

但对于关系数据库,这就是我们实现它的方式

有一个很大的区别:这两个列表是在一个表中实现的

每一行都是从两个方面查看的单个事实[对不起]用户查看了一个项目的事实,是用户查看了一个项目的同一个事实

所以这似乎是关系思维。。。实现了Mango风格,需要100%的数据和表复制。我不知道这在MongoDb中是好是坏,从某种意义上说,它很可能是实现该功能所必需的。丑陋如罪恶

我不知道下一步该怎么办。我走的路对吗

只要两个列表使用一个表,就可以使用关系表。如果你不理解这一点,可以问一个更具体的问题

如果不是,您能建议一种在非关系数据库中实现此功能的好方法吗?和MySql相比,这个建议在速度上有优势吗

对不起,我不能回答这个问题

但非关系型数据库不太可能存储和检索经典关系型信息,比半关系型记录归档系统(如myNONsql)更快。当然,一切都是平等的。一个真正的SQL平台会更快

对评论的答复 首先你有:

所以,我想让每个用户都拥有一个他查看的项目ID列表,每个项目都拥有一个他查看的用户ID列表

这是两个列表。这并不好,因为第二个列表与第一个列表100%重复

现在,您已在问题和新评论中编辑:

我不完全理解你所说的“两张表用一张表”是什么意思。我的解释是创建“已查看”表,其中保存了userId、itemId和查看时间

这很好,您现在有一个列表

为了弄清楚我们正在讨论的数据库,让我建立一个模型,让你确认一下

如果您不习惯标准符号,请注意,每一个小记号、凹口和标记,实线与虚线,正方形与圆角,都意味着非常具体的内容。请参阅

因此,当尝试推荐用户正在查看的当前项目时,我会Sub=selectuserid,其中itemId==currentItemId。然后,从查看的内部JOI中选择itemId N Sub on viewsed.userId=Sub.userId。这就是你的意思吗

我确实对这个表做了声明和警告,但是我没有给出任何关于非SQL编码的指示,所以没有

我绝不会建议分两步做一件事,一步就能完成。SQL有它的问题,但是从一组关系表中获取信息的困难,即使用单个SELECT的派生关系肯定不是问题之一

SUB不是SQL。虽然我可以猜测它的作用,但我很可能是错的,因此我无法对该代码进行评论

针对我提供的模型,在ISO/IEC/ANSI标准SQL平台上,我将使用:

    SELECT  DISTINCT ItemId     -- Items viewed by ...
        FROM UserItem
        WHERE UserId = (
            SELECT  UserId      -- Users who viewed Item
                FROM UserItem
                WHERE ItemId = @CurrentItemId
            )
您必须将其转换为平台所需的非SQL

对于本月浏览100个页面的100000用户来说,这不是太多了吗?很抱歉问了这么长时间

我在最初的答复中已经回答了这个问题。请再读一遍

您正在尝试解决尚未解决的性能问题。这是不可能的,考虑到物理定律,依赖性,我们无法颠倒时间顺序;因此,我建议您停止该活动

与此同时,回到农场,奶牛需要喂食。首先设计数据库,然后编写应用程序代码,然后,如果并且只有当存在性能问题时,才能解决这些问题。IT专业人士可以做出科学的估计,但我不能在这里给你一个这样的教程

每月10000000次页面浏览量。你没有说明物品的数量,所以这个大数字非常可怕。如果你告诉我有多少件物品;用户;每节课的平均浏览次数;至于您希望承保的期限(如月份),我可以给您提供更具体的建议

据我所知,用户只查看一个项目。作为一项促销功能,您希望系统识别查看此项目的人员也查看过的项目列表。。。。这似乎只是10000000个视图中的一小部分。每个表上都有索引,是吗?因此,您使用的非SQL程序不会读取10000000个视图来查找该分数,它将导航索引,并仅读取包含该分数的页面

一些非SQL需要第二个索引来执行真正的SQL平台使用一个索引执行的操作。我已经给出了模型中的第二个索引

虽然我理解没有为您描述的文件提供完整定义是可以的,但到目前为止,因为我提供了一个模型,所以我必须提供一个完整和正确的模型,而不是部分模型

由于用户多次查看项目,因此我提供了一个允许查看的表,并跟踪视图的数量和上次查看的日期。它是每个用户一行::项,永远。如果您希望表格支持每个用户一行::Item视图,请询问,我将提供


从我所坐的位置来看,根据迄今为止确定的事实,10000000这个数字并不重要。

非常感谢您的回复。所以,Rel数据库似乎更适合。我不完全理解你所说的“两张表用一张表”是什么意思。我的解释是创建“已查看”表,其中保存了userId、itemId和查看时间。因此,当尝试推荐用户正在查看的当前项目时,我会Sub=selectuserid,其中itemId==currentItemId。然后,在viewsed.userId=Sub.userId上从viewsed内部联接子节点中选择itemId。这就是你的意思吗?对于本月浏览100个页面的100000用户来说,这不是太多了吗?抱歉问了这么长时间。@noobie。不客气。我已在答覆中作出回应。请复习。谢谢。请投票。