Mysql “查看此项目的用户也查看了…”的数据库
我想创建一个功能“谁查看了这个项目也查看了”像亚马逊或易趣。我决定在MySql和非关系数据库(如MongoDB)之间进行选择 编辑:在MySql中实现此功能似乎很简单。我猜是在创建“已查看”表,其中保存了userId、itemId和查看时间。因此,当尝试推荐用户正在查看的当前项目时,我会Sub=从查看中选择userId,其中itemId==currentItemId,然后在viewsed.userId=Sub.userId上从查看的内部连接Sub中选择itemId 对于本月浏览100页的100000用户来说,这不是太多了吗 对于非关系数据库,我认为让用户嵌入所有用户或让项嵌入所有用户是不对的。所以,我想让每个用户都拥有一个他查看的itemid列表,每个Item都拥有一个他查看的userid列表。我不知道下一步该怎么办。我走的路对吗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相比,这个建议在速度上有优势吗?这可能更多地取决于您如何实现此功能,而不是所使用的数据库类型 如果您只是存储了很多查看历史记录,比如用户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。不客气。我已在答覆中作出回应。请复习。谢谢。请投票。