构建表格时

时间:2016-07-20 17:20:11

标签: mysql database database-design relational-database relationship

如果我有2个具有1-1强依赖性的项目,那么一个是属性,即另一个表中的列。
例如。如果我们有一个电影数据库并且每部电影必须有一个评论分数(评论分数是一个代表X个观众的平均分数的数字)并且每个评论分数属于一部电影那么评论分数应该是表Movie中的一列 现在,如果评论得分来自实际进行评审的X个人,那么这应该也是电影数据库的一部分。 但对我来说似乎很奇怪,因为人数是评论得分不属于电影的属性吗? 我是否误解了这种数据库设计方法/理论中的某些内容?

3 个答案:

答案 0 :(得分:0)

计划A:拥有另一张表(movie_id,user_id,score)。然后做

SELECT ROUND(AVG(score), 1)
    FROM tbl
    WHERE movie_id = $movie_id
PRIMARY KEY(movie_id, user_id)

计划B:将这两列保留在影片表中,或与影片表保持1:1对应关系的表格中:( score_count,score_sum)。然后计算平均值:

SELECT ROUND(score_sum / score_count, 1)
    FROM ...
    WHERE movie_id = $movie_id

记录新分数(如果是单独的表格)

INSERT INTO movie_scores ( movie_id, score_count score_sum )
    VALUES ($movie_id, 1, $score)
    ON DUPLICATE KEY UPDATE
        score_count = score_count + 1,
        score_sum = score_sum + VALUES(score_sum);
PRIMARY KEY(movie_id)

如果与其他电影信息相同:

Initialize the two columns to 0.
Deal with the case where the average is 0/0.
UPDATE movies SET
        score_count = score_count + 1,
        score_sum = score_sum + $score
    WHERE movie_id = $movie_id

我更喜欢使用单独的表(以及视图计数,LIKE,upvotes等),尽管它是1:1。这是因为movie_scores会经常更新。该表的流量和movies的流量是独立的。将它们分开可以减少争用(在非常繁忙的系统中)。

答案 1 :(得分:0)

您似乎使用"评分"对于两个不同的概念:一个是"用户得分的值的平均值"一部电影另一个是存在与这样的价值分开的东西,其中两个具有相同"评论得分的电影"价值可以与不同的评价得分相关联。的东西。有一个常见的日常相关的事情:电影的用户评论,我们可以为电影调用用户(评论)评分的关联值。您的评分是我们最好称之为"评论平均值"一部电影,你的评论得分为a"评论平均得分"。在您的设计中,可能需要审查和/或审查平均事物而不仅仅是分数,例如,如果我们将其与其他事物/价值观相关联,例如(评论)评论或(评论平均值) )用户数量。但事情与价值观截然不同。

所以你的电影可能是1:1的评分得分。但即便如此,不同的电影也可以拥有相同的评论价值。 (如果有电影未经用户评论,则电影可能没有评论评分值。)因此,我们不是在谈论电影和评论评分值之间的1:1对应关系。

短语喜欢"有一个","属于" "是"的属性(属性),"关联"和"相关"很模糊例如:你说评论得分"属于"电影。但是电影也可以属于"评论得分。

这些短语提出了问题。相反,确定 (应用程序)关系,由表(基础,视图或查询)表示,正在说某些事物/值参与in。例如:" SCORE是来自电影MOVIE"的N个用户评论的评论平均分数,给出表(和速记)电影(电影,分数,n)。

只有在您确定了您正在讨论的特定关系时,才会执行"之类的短语。和"属于"或""基数为"甚至有意义。例如:我们可以将电影(电影,乐谱,n)表达为"电影MOVIE具有来自N个用户评论的评论得分值SCORE"只要我们意识到这是一个非常具体的使用" has"就这张桌子而言。

我们必须决定足够的基本关系,每个基本关系都以这样的谓词(句子模板)为特征并用表格表示,以完整地描述可能出现的任何应用情况。例如:如果一部电影没有评论,那么我们就可以将电影用于行,其中电影电影MOVIE具有一些用户评论的评分值SCORE"但不是"电影MOVIE有评论得分值SCORE"。所以这需要一个额外的谓词/表。如果电影必须有一个评论,那么这两个谓词意味着相同的事情,我们可以只使用电影。

许多感兴趣的谓词可以用相应的基表和关系运算符来表示一些其他谓词,谓词和它们对应的表。这些是视图和查询。例如:考虑到HorrorFan(用户,电影)"对于STARS,SCORE&amp ;;的某些值。 N,用户USER将用户得分值STARS给予类型'恐怖'中的电影MOVIE。评论得分值SCORE和STARS> 2 * SCORE"。它可以改为"有STARS,GENRE,SCORE&的EXISTS值。 N,使得评论(用户,电影,明星)和类型(电影,一般)和电影(电影,分数,N)和明星> 2 * SCORE和GENRE ='恐怖'"。满足它的行,即它的值,通过用某些关系运算符替换表名和某些逻辑运算符来表示:SELECT user, movie FROM Review NATURAL JOIN Genre NATURAL JOIN Movie WHERE STARS > 2 * SCORE and GENRE = 'Horror'

因此,请停止使用这些模糊的单词并开始查找相关的谓词,每个谓词都会得到一个表格。

答案 2 :(得分:0)

从实体关系的角度来看,不要将属性与1:1关系混淆。属性与关系不同 - 属性映射到值集,而关系映射实体集。实体集是键值,而值集是非键值。

属性是1:N关系,例如每部电影与一个评论分数相关联,但多部电影可能具有相同的评论分数。如果找到1:1属性,则可能表示未标识的自然键。

评论电影的人数不是评论评分的属性。如果得分为8,你能不能告诉我有多少人评论了这部电影?我不这么认为。相反,评论分数和人数都是您未录制的评论池的度量。给定电影和评论池之间的1-1关系,评论池的属性可传递地适用于电影。删除审阅池,您可以直接在电影上录制这些属性。