我的ERD目前存在3个主要问题。 ERD是类似于IMDB的在线电影数据库。
(下图)将这两个实体作为实体与“网站用户”实体分开是正确的,因为评论者的得分是普通用户的2倍?还是应该在“网站用户”下将它们列为属性?因为这样可以消除userID的加倍。当我稍后需要实际计算每种用户类型的“最终”分数时,这会有所不同吗?
(第二个图像箭头)用户可以给特定电影评分。这些评分中的每一个均被平均为“平均电影评分”。我在哪里附加列出用户评分的关系,然后如何处理,然后将每个用户评分的计算联系起来以得出最终平均评分。
(第2个和第一个图像圈)用户“点赞”一个或多个电影。在电影表中,存在一个关系,以便可以列出“相关电影”。 “相关”方法有两种。
a)同类型
b)喜欢这个的用户还喜欢...
我在哪里有关系,因为我已经从用户到电影有一个“喜欢”(将显示在用户个人资料等上)。我是否将初始“喜欢”更改为三元关系,而将其他关系转到“喜欢的用户” ”还是我必须直接在用户和“用户也喜欢的”实体之间建立新的关系。
图片:http://imgur.com/a/PZ8MV
我现在很困惑,所以任何输入将不胜感激。
干杯
最佳答案
分数结合了电影,用户和给定的分数,对吗?当然还有得分的时间。我一定会将网络用户和评论家存储在一张桌子中。如果您真的认为那些表中会出现大量条目,那么您可以将分数“ critics score”加倍。这也将反映出一个事实,即可能“退休”的批评家当时的重要性是其两倍。所以:
表用户(user_id,is_critic tinyint,名称...);
表得分(user_id,movie_id,score,is_critic tinyint,scoretime ...);
然后,当您将1 =评论者,0 =网络用户时,选择内容将只是sum((1+is_critic) * score) / sum(1+is_critic)
。
(忽略此行;仅再增加一个计数器“ 1”,堆栈溢出就使我感到困惑)
如果要存储平均评分,则不要将其作为商(如我刚才给出的示例),而是在这两个部分中:sum(weighted score)
和sum(weighted number)
。我想您迟早会有一个时间标度(分数上升或下降,投票数...),因此创建一个具有时间间隔(例如几周?)的表,然后将您的平均前表连接到该表。然后,您可以轻松总结电影的这些收视率。在评论中询问是否过于紧凑。
单个数据在单个用户评分中,因此对于一部电影,您可以选择所有对该电影进行投票的用户,然后从中选择这些用户的所有其他已评分电影以及计数。收视率很高时,速度可能会变慢。我将花一分钟的时间对此进行很好的汇总,但是我很确定它也将涉及周表。对于通常的电影,如果他们的注意力是几天或几周内的总和,或者如果您正在研究会持续数月,数年或更长的注意力的电影,则我没有任何常识。但是,即使是30年,也只有1500周,因此对于mysql来说已经不多了。
出现一个问题:两个乐谱之间的时间对于乐谱电影的关系重要吗?有人在13岁时就将《冰河世纪》评为一部了不起的电影,但是2年后,他开始享受《纸浆小说》了。我不确定是否可以按照您的意思将这两部电影联系起来。
一旦定义了它们之间的关系,就应该定义一个限制,以多少用户(在一定时间间隔内)“连接”这些电影与“连接”相关。原则上会出现一个表,其中包含(电影数量)x(电影数量)[x时间? ]条目,该条目可能数量很多。由于存在对称关系,因此需要带有or
子句的查询非常糟糕(对于索引使用和计时不利),或者应该将两个方向都存储在那里(x与y关联,权重为0.1,所以y与x关联)重量为0.1)。这就是为什么我会持有两种门槛:
仅当有多于(非常棘手的人数)用户对好或差都打分时,才存储该关系(棘手的人数应取决于网站的总体费率以及两部电影的总费率)
每部电影仅存储20个最热门的关系。
因此,仍然有一些部分会让您感到开心和头痛,尤其是第3部分将成长为或多或少复杂的人工智能规则和“我不是那样的意思”,因此为第3部分做好准备用与MySQL不同的技术来存储数据。但是原始数据在MySQL中是好的,至少对于前几百万个等级而言。总而言之,这不会占用太多内存,因此整个评估系统应在相当长的一段时间内放入合理大小的RAM中。
因此,我的汇总表将包含以下字段:
movie_x_id movie_y_id ratings_until users_connecting users_connecting_same users_connecting_anti
我认为用户最多只能一次评价一部电影,因此不涉及复杂的数字数学。
users_connecting
是对两部电影都进行了投票(在某个时间?)的用户总数,_same
将给出或多或少给出相同方向(都好,都不好,都中等)和是发现一部电影出色和一部电影不好的用户数量。(提示:请谨慎保存分数,您可以从系统1 ... 10开始,然后再切换到1..5,这会使所有的lala-movies变差。您可以定义内部保存分数,每个用户给定的分数都会转移到该分数中。)
如果仍有问题,请在评论中提问。
关于mysql - 更正此ERD这些部分的最有效方法是什么?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/23500674/