首页 文章

纠正此ERD的这些部分的最有效方法是什么?

提问于
浏览
0

我目前在ERD中有3个主要问题 . ERD是类似于IMDB的在线电影数据库 .

  • (下图)将这两个实体作为实体与网站用户实体分开是否正确,因为评论家的分数值得普通用户的2分相同?或者我应该将它们列为网站用户下的属性?因为这将消除userID的加倍 . 当我需要在轨道后面实际计算每种用户类型的“最终”分数时,这会有什么不同吗?

  • (第2张图像箭头)用户可以为特定电影评分 . 这些评分中的每一个都被平均为“平均电影评级” . 我在哪里附上列出用户评级的关系,然后我将如何处理然后将每个用户评级的计算与最终平均评级相关联 .

  • (第二和顶部图像圈)用户“喜欢”一个或多个电影 . 在电影表中,存在关联以便可以列出“相关电影” . “相关”方法来自两种方式;

a)同一类型

b)喜欢这个的用户也喜欢......

我在哪里附上这种关系,因为我已经有一个从用户到电影的“喜欢”(要在用户 Profiles 中显示等等 . 我是否将最初的喜欢改为与其他关系的三元关系转到'用户也喜欢'或者我必须在用户和'用户也喜欢'实体之间直接 Build 新的关系 .

图片:http://imgur.com/a/PZ8MV

我现在感到非常困惑,所以任何输入都会受到赞赏 .

干杯

1 回答

  • 1
    • 得分结合了电影,用户和给定的分数,对吧?当然还有得分的时间 . 我肯定会将网络用户和评论家存储在一个表中 . 如果你真的认为这些表中会出现大量条目,那么你可以将得分中的标志"critics score"翻倍 . 这也反映了当时可能是批评者2倍的重要事实 . 所以:

    表用户(user_id,is_critic tinyint,name ...);

    表得分(user_id,movie_id,得分,is_critic tinyint,得分时间......);

    然后选择将只是 sum((1+is_critic) * score) / sum(1+is_critic) ,当你使1 =评论时,0 = webuser .

    • (忽略这一行;只是一个计数器"1"再次,堆栈溢出欺骗我与nimbers)

    • 如果你想存储平均评级,那么不要作为商(如我刚刚给出的例子中那样),而是在其中的两个部分: sum(weighted score) AND sum(weighted number) . 我猜你迟早会有时间刻度(分数上升或下降,投票数量......),所以创建一个有时间间隔的表(比方说,几周?)并将你的预平均表连接到那个表 . 然后,您可以轻松地对电影的这些评级进行总结 . 如果过于紧凑,请在评论中提问 .

    • 单个数据属于单个用户评级,因此对于一部电影,您可以选择投票该电影的所有用户,并从那里选择这些用户的所有其他评级电影以及计数 . 大量收视率可能会变慢 . 关于这个问题的一个很好的汇总,我会说一点,但我很确定它也会涉及周表 . 我对普通的电影电影没有任何常识,如果他们的注意力是在数天或数周内计算的,或者你是在研究注意力持续数月,数年或更长时间的电影 . 但即使它是30年,那只是1500周,所以没有多长时间的mysql .

    有一个问题出现了:两个分数之间的时间对得分电影的关系很重要吗?有人在13岁时将“ICE AGE”评为一部伟大的电影,但2年后,他喜欢“低俗小说” . 我不确定你是否将这两部电影联系在一起 .

    只要您可以定义它们之间的关系,就应该定义一个限制,这些电影应该有多少"connected"这些电影(在某个时间间隔内)与"connection"相关 . 原则上出现了一个表(电影数量)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 会给予或多或少给出相同指示的用户数量(好的,坏的,都是中等的), _anti 是用户数量发现一部电影很棒,一部电影很糟糕 .

    (提示:注意以良好的方式存储乐谱 . 你可以从系统1 ... 10开始,然后再切换到1 ... 5,这会使所有的lala-movies变坏 . 你可以定义一个内部保存分数,每个用户给定的分数转移到其中 . )

    如果还有问题,请在评论中提问 .

相关问题