【问题标题】:What is the most effective way to correct these sections of this ERD?更正此 ERD 的这些部分的最有效方法是什么?
【发布时间】:2014-05-06 17:00:39
【问题描述】:

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

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

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

  3. (第二个和顶部图像圈)用户“喜欢”一个或电影/秒数。在电影表中,存在可以列出“相关电影”的关系。 “相关”方法来自两种方式;

a) 相同的流派

b) 喜欢此文的用户也喜欢...

我应该在哪里附加这种关系,因为我已经从用户那里获得了对电影的“喜欢”(将显示在用户个人资料等上。我是否将最初的喜欢更改为三元关系,而另一个关系转到“用户也喜欢”还是我必须直接在用户和“用户也喜欢”实体之间建立新关系。

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

我现在很困惑,所以任何意见都将不胜感激。

干杯

【问题讨论】:

    标签: mysql database entity-framework database-design erd


    【解决方案1】:
    1. 分数结合了电影、用户和给定分数,对吗?当然还有给出分数的时间。我肯定会将网络用户和评论家存储在一张桌子上。如果您真的认为这些表格中会出现大量条目,那么您可以在分数中加倍标记“评论家分数”。这也反映了一个可能“退休”的批评家在当时的重要性是 2 倍的事实。所以:

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

      表格分数(user_id、movie_id、score、is_critic tinyint、scoretime...);

    当您设置 1 = 评论家,0 = 网络用户时,选择将只是 sum((1+is_critic) * score) / sum(1+is_critic)

    1. (忽略这一行;再次只是一个计数器“1”,堆栈溢出会欺骗我)
    2. 1234563我猜你迟早会有一个时间尺度(分数上升或下降,投票数......),所以创建一个有时间间隔的表(比如,几周?)并将你的预平均表连接到那个。然后,您可以轻松总结电影的这些评分。在评论中询问是否过于紧凑。
    3. 单个数据在单个用户评分中,因此对于一部电影,您可以选择所有投票过该电影的用户,然后从那里选择这些用户的所有其他评分电影以及计数。如果收视率很高,这可能会变慢。我会花一点时间来讨论一下它的良好聚合,但我很确定它也会涉及周表。我对通常的电影院电影没有常识,如果他们的注意力以几天或几周为单位计算,或者如果你工作的电影类型的注意力会持续数月、数年或更长时间。但就算是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 将给出或多或少给出相同方向的用户数(都好,都差,都中等),@987654328 @ 是认为一部电影好一部电影差的用户数。

    (提示:小心以良好的方式存储分数。您可能从系统 1...10 开始,然后切换到 1..5,这会使所有 so-lala-movies 都变坏。您可以定义分数的内部保存,每个用户给定的分数都会转移到其中。)

    如果还有问题,请在 cmets 中提问。

    【讨论】:

      猜你喜欢
      • 2012-07-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-06-07
      • 1970-01-01
      • 2012-01-21
      • 1970-01-01
      相关资源
      最近更新 更多