设计一个数据库记录体育运动类的会员积分变化

要设计一个数据库来处理基于会员间积分差距的积分变化规则,需要记录会员的积分历史、比赛结果以及积分变化的规则。以下是一些建议的数据库设计:

  1. 会员积分表(MemberScores)

    • MemberScoreID:积分记录的唯一标识。
    • MemberID:外键,关联到会员表的MemberID。
    • Score:当前积分。
    • LastUpdated:积分最后更新的时间。
  2. 比赛记录表(Matches)

    • MatchID:比赛的唯一标识。
    • WinnerMemberID:胜者会员ID(外键,关联到会员表的MemberID)。
    • LoserMemberID:负者会员ID(外键,关联到会员表的MemberID)。
    • MatchDate:比赛日期。
    • PointsDifference:比赛时两位会员的积分差距。
  3. 积分变化规则表(ScoreChangeRules)

    • RuleID:规则的唯一标识。
    • MinPointsDifference:积分差距的最小值。
    • MaxPointsDifference:积分差距的最大值。
    • WinnerPointsToAdd:胜方增加的积分。
    • LoserPointsToSubtract:负方减少的积分。
  4. 比赛积分变化表(MatchScoreChanges)

    • ScoreChangeID:积分变化的唯一标识。
    • MatchID:外键,关联到比赛记录表的MatchID。
    • WinnerPointsAdded:实际给胜者的积分。
    • LoserPointsSubtracted:实际从负者扣除的积分。
  5. 积分变化历史表(ScoreHistory)

    • HistoryID:积分变化历史记录的唯一标识。
    • MemberID:外键,关联到会员表的MemberID。
    • ChangeDate:积分变化的日期。
    • OldScore:变化前的积分。
    • NewScore:变化后的积分。
    • Reason:积分变化的原因,例如“比赛结果”。
  6. 积分更新触发器(Trigger)

    • 每当新的比赛记录被插入到比赛记录表时,触发器将根据积分变化规则表计算胜者和负者的积分变化,并更新会员积分表和比赛积分变化表。

以下是实现积分更新逻辑的大致步骤:

  • 插入新比赛记录到比赛记录表。
  • 触发器检查比赛记录,并确定积分差距。
  • 触发器查找积分变化规则表,找到适用的规则。
  • 触发器根据规则更新会员积分表,并记录积分变化到比赛积分变化表和积分变化历史表。

SQL示例(伪代码):

-- 插入新比赛记录
INSERT INTO Matches (WinnerMemberID, LoserMemberID, MatchDate, PointsDifference)
VALUES ([胜者MemberID], [负者MemberID], [比赛日期], [积分差距]);

-- 触发器逻辑
CREATE TRIGGER UpdateScoresAfterMatch
AFTER INSERT ON Matches
FOR EACH ROW
BEGIN
  DECLARE winner_points INT;
  DECLARE loser_points INT;
  -- 根据比赛积分差距查找适用的规则
  SELECT WinnerPointsToAdd, LoserPointsToSubtract
  INTO winner_points, loser_points
  FROM ScoreChangeRules
  WHERE MinPointsDifference <= NEW.PointsDifference AND NEW.PointsDifference <= MaxPointsDifference;
  
  -- 根据规则更新积分
  UPDATE MemberScores
  SET Score = Score + winner_points
  WHERE MemberID = NEW.WinnerMemberID;

  UPDATE MemberScores
  SET Score = Score - loser_points
  WHERE MemberID = NEW.LoserMemberID;
  
  -- 记录积分变化历史
  INSERT INTO ScoreHistory (MemberID, ChangeDate, OldScore, NewScore, Reason)
  VALUES (NEW.WinnerMemberID, NOW(), (SELECT Score FROM MemberScores WHERE MemberID = NEW.WinnerMemberID) - winner_points, (SELECT Score FROM MemberScores WHERE MemberID = NEW.WinnerMemberID), 'Match score change');
  
  INSERT INTO ScoreHistory (MemberID, ChangeDate, OldScore, NewScore, Reason)
  VALUES (NEW.LoserMemberID, NOW(), (SELECT Score FROM MemberScores WHERE MemberID = NEW.LoserMemberID) + loser_points, (SELECT Score FROM MemberScores WHERE MemberID = NEW.LoserMemberID), 'Match score change');
END;

请注意,上述SQL示例是一个概念性的展示,具体的SQL语法和实现细节将根据你使用的数据库系统而有所不同。此外,触发器的编写可能需要根据你的具体业务逻辑进行调整。

posted @   cnyjh  阅读(30)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· AI 智能体引爆开源社区「GitHub 热点速览」
· C#/.NET/.NET Core技术前沿周刊 | 第 29 期(2025年3.1-3.9)
· 从HTTP原因短语缺失研究HTTP/2和HTTP/3的设计差异
点击右上角即可分享
微信分享提示