【问题标题】:What is the most effective way to correct these sections of this ERD?更正此 ERD 的这些部分的最有效方法是什么?
【发布时间】:2014-05-06 17:00:39
【问题描述】:
我的 ERD 目前有 3 个主要问题。 ERD 是一个类似于 IMDB 的在线电影数据库。
(下图)将这 2 个实体作为与网站用户实体分开的实体是否正确,因为评论家的分数值 2 倍于普通用户的相同分数?或者我应该将它们列为网站用户下的属性?因为这将消除用户 ID 的加倍。当我以后需要实际计算每种用户类型的“最终”分数时,这会有什么不同吗?
(第二张图片-箭头)用户可以给特定电影评分。这些评级中的每一个都被平均为“平均电影评级”。我在哪里附加列出用户评分的关系,然后我将如何处理每个用户评分的计算以得出最终的平均评分。
(第二个和顶部图像圈)用户“喜欢”一个或电影/秒数。在电影表中,存在可以列出“相关电影”的关系。 “相关”方法来自两种方式;
a) 相同的流派
b) 喜欢此文的用户也喜欢...
我应该在哪里附加这种关系,因为我已经从用户那里获得了对电影的“喜欢”(将显示在用户个人资料等上。我是否将最初的喜欢更改为三元关系,而另一个关系转到“用户也喜欢”还是我必须直接在用户和“用户也喜欢”实体之间建立新关系。
图片:http://imgur.com/a/PZ8MV
我现在很困惑,所以任何意见都将不胜感激。
干杯
【问题讨论】:
标签:
mysql
database
entity-framework
database-design
erd
【解决方案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”,堆栈溢出会欺骗我)
1234563我猜你迟早会有一个时间尺度(分数上升或下降,投票数......),所以创建一个有时间间隔的表(比如,几周?)并将你的预平均表连接到那个。然后,您可以轻松总结电影的这些评分。在评论中询问是否过于紧凑。
单个数据在单个用户评分中,因此对于一部电影,您可以选择所有投票过该电影的用户,然后从那里选择这些用户的所有其他评分电影以及计数。如果收视率很高,这可能会变慢。我会花一点时间来讨论一下它的良好聚合,但我很确定它也会涉及周表。我对通常的电影院电影没有常识,如果他们的注意力以几天或几周为单位计算,或者如果你工作的电影类型的注意力会持续数月、数年或更长时间。但就算是30年,也不过1500周,对mysql来说不算长。
出现了一个问题:两个得分之间的时间对于得分电影的关系是否重要?有人在 13 岁时将《冰河世纪》评为一部伟大的电影,但 2 年后他喜欢上了《低俗小说》。我不确定这是否会按照您的意思将这两部电影联系起来。
一旦您可以定义它们之间的关系,您就应该定义一个限制,有多少用户应该“连接”这些电影(在特定时间间隔内)以与“连接”相关。原则上会出现一个表格,其中包含(电影数量)x(电影数量)[x时间?? ] 条目,这可能会得到一个很大的数字。由于您具有对称关系,因此您需要使用 or 子句进行非常糟糕的查询(不利于索引使用和计时),或者您应该将两个方向都存储在那里(x 与 y 相关,权重为 0.1,因此 y 与 x 相关权重为 0.1)。这就是为什么我会持有两种门槛:
所以仍然有一些部分让你感到有趣和头疼,尤其是第 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 中提问。