需要MySQL约束和派生值建议

需要MySQL约束和派生值建议,mysql,constraints,derived,Mysql,Constraints,Derived,我最近开始玩数据库,试着用例子自学 我有以下问题,我目前正在努力解决,这让我很困惑,我希望有人能给我一些启示 该数据库有4个表。摄影师、图片、比赛和观众。这个概念是摄影师参加比赛。他们为每场比赛拍摄一张照片,观众对其进行评分。比赛的获胜者是得分最多的人。我提出了以下限制 评分在0-5之间 只有前20名观众可以投票 我不想存储摄影师的总评分,因为我想学习如何计算派生值 对于数字1和2,我不确定如何显式创建此约束。 对于数字3,我不知道如何在db上表示派生值。 我正在使用MySql 如有任何想法、建

我最近开始玩数据库,试着用例子自学

我有以下问题,我目前正在努力解决,这让我很困惑,我希望有人能给我一些启示

该数据库有4个表。摄影师、图片、比赛和观众。这个概念是摄影师参加比赛。他们为每场比赛拍摄一张照片,观众对其进行评分。比赛的获胜者是得分最多的人。我提出了以下限制

  • 评分在0-5之间
  • 只有前20名观众可以投票
  • 我不想存储摄影师的总评分,因为我想学习如何计算派生值
  • 对于数字1和2,我不确定如何显式创建此约束。 对于数字3,我不知道如何在db上表示派生值。 我正在使用MySql

    如有任何想法、建议,将不胜感激


    致以最诚挚的问候

    1]据我所知,您无法在MySQL中直接设置此类约束。您可以将
    UNSIGNED TINYINT
    与允许的值0-255一起使用,但在将值插入数据库之前,您必须检查这些值是否正确

    2] 我是否正确理解您希望每张图片最多只允许20票

    你要么将所有的选票存储在一个单独的数据库中(然后检查已有的投票数),要么只保存平均投票数和投票数。无论哪种方式,您都必须亲自检查并确定是否允许用户投票。对于第一种选择:

    SELECT COUNT(*) > 20 FROM votes
    WHERE picture_id = '123'
    
    对于第二个更简单的问题:

    SELECT votes_count > 20 FROM pictures
    WHERE id = '123'
    
    3] 如果您对图片的投票直接存储在图片数据库中,只需使用SUM()函数:

    SELECT *, SUM(points) as total_points FROM photographers AS ph
    LEFT JOIN pictures AS pic ON pic.photographer_id = ph.id
    GROUP BY p.id, competition_id
    

    我希望我在那里没有犯错误。如果您有更详细的问题,请尽管问,我会尽力填补这些漏洞;)

    1)查看
    enum
    值,尽管
    tinyint(1)unsigned
    可能更快

    是的,enum是一种可能性,但计算总计或平均值会很麻烦。如果您的enum值代表数字enum键,计算是透明的,因为MySQL中的所有计算都是用键完成的anyways@freddy,对不起,请问您的确切意思是什么?如果您在enum中设置值,例如
    enum('1','2','3')
    ,则值在DB中表示为整数(在这种情况下为0-2)。数值转换将使用整数而不是值。诸如
    selectsum(enumfield)fromtest
    之类的查询将返回索引的总和。有关更多信息,请参阅。@freddy K.,我知道ENUM是如何存储的,但从没想过我可以用它做这样的数学运算。我认为这很容易出错,因为系统在某种程度上是“隐藏”的,可能下一个程序员看不清楚。但不管怎么说很有趣,+1!