我的ERD目前有3个主要问题。 ERD是一个类似于IMDB的在线电影数据库。
(下图)将这两个实体作为实体与网站用户实体分开是否正确,因为评论家的分数值得普通用户的2倍相同分数?或者我应该将它们列为网站用户下的属性?因为这将消除userID的加倍。当我需要在赛道后面实际计算每种用户类型的“最终”分数时,这会有什么不同吗?
(第2张图像箭头)用户可以为特定电影评分。这些评分中的每一个都被平均为“平均电影评级”。我在哪里附上列出用户评级的关系,然后我将如何处理然后将每个用户评级的计算与最终平均评级相关联。
(第二和顶部图像圈)用户“喜欢”一部或多部电影。在电影表中,存在关联以便可以列出“相关电影”。 “相关”方法来自两种方式;
a)相同类型
b)喜欢这个的用户也喜欢......
我在哪里附上这种关系,因为我已经有一个从用户到电影的'喜欢'(要在用户个人资料中显示等等。我是否将最初的喜欢改为三元关系,其他关系转到''用户也喜欢'或者我必须在用户和'用户也喜欢'实体之间直接建立新关系。
此刻我感到非常困惑,所以任何输入都会受到赞赏。
干杯
答案 0 :(得分:1)
分数结合了电影,用户和给定的分数,对吧?当然还有得分的时间。我肯定会将网络用户和评论家存储在一个表中。如果你真的认为这些表格中会出现大量的条目,那么你可以将分数中的“评论家得分”加倍。这也反映了这样一个事实:当时可能“退休”的评论家 2倍。所以:
表用户(user_id,is_critic tinyint,name ...);
表格得分(user_id,movie_id,得分,is_critic tinyint,得分时间......);
当你做1 =评论,0 = webuser时,选择将只是sum((1+is_critic) * score) / sum(1+is_critic)
。
如果你想存储平均评分,那就不要作为商(如我刚刚给出的例子),但在其中的两部分:sum(weighted score)
和{{1} }。我想你迟早会有时间刻度(得分上升或下降,投票数量......),所以创建一个有时间间隔的表格(比如几周?)并将你的预平均表连接到那个表格。然后,您可以轻松地对电影的这些评级进行总结。如果过于紧凑,请在评论中提问。
单个数据属于单个用户评级,因此对于一部电影,您可以选择投票给该电影的所有用户,并从那里选择这些用户的所有其他评级电影以及计数。大量收视率可能会变慢。关于这个问题的一个很好的汇总,我会说一点,但我很确定它也会涉及周表。我对普通的电影电影没有任何常识,如果他们的注意力是在数天或数周内计算的,或者你是在研究注意力持续数月,数年或更长时间的电影。但即使它是30年,那只是1500周,所以没有多长时间的mysql。
出现了一个问题:对于得分电影的关系,两个分数之间的时间是否重要?有人在13岁时将“ICE AGE”评为一部伟大的电影,但2年后,他喜欢“低俗小说”。我不确定那是否就你所说的意义上的那两部电影联系起来。
只要您可以定义它们之间的关系,就应该定义一个限制,即有多少用户应该“连接”这些电影(在特定时间间隔内)与“连接”相关。原则上出现了一个表(电影数量)x(电影数量)[x时间??条目,这可能会得到一个很大的数字。由于你有一个对称的关系,你需要一个带有sum(weighted number)
子句的非常糟糕的查询(索引使用和时间不好),或者你应该在那里存储两个方向(x与y相关,权重为0.1,所以y是相关的以x为重量0.1)。这就是为什么我会持有两种威力:
仅当存在超过(这里非常棘手的数字)用户评价好或坏的时才存储该关系(棘手的数字应取决于网站的整体费率,以及总体费率两部电影)
每部电影只存储20个最热门的关系。
因此,仍有一些部分可以为您带来乐趣和头痛,特别是第3部分将会成长为一个或多或少复杂的人工智能规则和“我不是那个意思”,所以部分3准备以不同于MySQL的技术存储数据。但原始数据在MySQL方面表现不错,至少在前几百万的评级中如此。总而言之,内存不多,所以整个评级系统应该在合理大小的RAM中适应一段时间。
因此,我的聚合表将包含以下字段:
or
我认为用户最多可以对电影评分一次,因此不涉及复杂的数字数学。 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都不好。你可以定义分数的内部保存,每个用户给定的分数将被转移到其中。)
如果还有问题,请在评论中提问。