你在虎扑看到的NBA数据都是怎么形成的?

941 阅读6分钟

作为一名前端工程师,我通常关注的是如何将数据展示给用户,但了解后端数据库的设计也是非常重要的。这不仅能帮助我们更好地理解数据的来源和结构,还能让我们在前端应用中更高效地处理和展示数据。今天,我们就一起来学习如何设计一个 NBA 赛季投篮数据表 shots,并解释每个字段的设计原因。

🐟引言

先让卢卡给大家送上一束鲜花。

image.png

NBA 是全球最受欢迎的篮球联赛,每年都会产生大量的统计数据,我放一个LINK给大家,⛹🏾‍♂️ NBA Shots,这是nba官方的数据,非常全,大家感兴趣的可以去看看 。其中,投篮数据是最基础也是最重要的数据之一。通过设计一个合理的投篮数据表,我们可以更好地分析球员的表现、球队的战术以及比赛的趋势。接下来,我们将一步一步地设计这个投篮数据表,并解释每个字段的意义和它的设计原因。

投篮数据表设计

我们将设计一个名为 shots 的数据表,用于记录 NBA 赛季中球员的每一次投篮。以下是数据表的 SQL 定义及每个字段的解释:


CREATE TABLE shots (
    shot_id INT AUTO_INCREMENT PRIMARY KEY,  -- 主键,唯一标识每条投篮记录
    player_name VARCHAR(100) NOT NULL,      -- 球员姓名
    player_id INT NOT NULL,                 -- 球员ID
    player_position VARCHAR(50) NOT NULL,   -- 球员位置(如 SG)
    shot_made BOOLEAN NOT NULL,              -- 投篮是否命中
    shot_type ENUM('2pt', '3pt') NOT NULL,  -- 投篮类型(2分球或3分球)
    action_type ENUM('Layup', 'Dunk', 'Jump Shoot', 'Hook Shoot', 'Fadeaway') NOT NULL,  -- 投篮动作类型
    team_id INT NOT NULL,                   -- 球队ID
    game_id INT NOT NULL,                   -- 比赛ID
    shot_date DATE NOT NULL,                -- 投篮日期
    distance INT NOT NULL,                  -- 投篮距离(单位:英尺)
    game_time TIME NOT NULL,                -- 比赛时间(比赛开始后的具体时间)
    time_left TIME NOT NULL,                -- 距离比赛结束的时间(分、秒)
    season VARCHAR(10) NOT NULL,            -- 赛季(如 2022-23)
    FOREIGN KEY (team_id) REFERENCES teams(team_id),  -- 外键,关联球队表
    FOREIGN KEY (game_id) REFERENCES games(game_id)   -- 外键,关联比赛表
);

🐟字段解释

  1. shot_id:

    • 类型:INT
    • 属性:AUTO_INCREMENTPRIMARY KEY
    • 说明:这是每条投篮记录的唯一标识符。使用 AUTO_INCREMENT 可以自动为每条新记录生成一个唯一的 ID,这样我们就不需要手动管理 ID 的分配了。
  2. player_name:

    • 类型:VARCHAR(100)
    • 属性:NOT NULL
    • 说明:记录投篮球员的名字。使用 VARCHAR 类型可以存储不同长度的字符串,100 个字符通常足够长,可以容纳大多数球员的名字。
  3. player_id:

    • 类型:INT
    • 属性:NOT NULL
    • 说明:这是球员的唯一标识符,用来区分不同的球员。使用整数类型可以提高查询和索引的效率。
  4. player_position:

    • 类型:VARCHAR(50)
    • 属性:NOT NULL
    • 说明:记录球员的位置,如 SG(得分后卫)、PG(控球后卫)等。使用 VARCHAR 类型可以存储这些简短的字符串。
  5. shot_made:

    • 类型:BOOLEAN
    • 属性:NOT NULL
    • 说明:记录投篮是否命中。布尔类型只有两个值:TRUE(命中)和 FALSE(未命中),非常适合这种二选一的情况。
  6. shot_type:

    • 类型:ENUM('2pt', '3pt')
    • 属性:NOT NULL
    • 说明:记录投篮的类型,即 2 分球或 3 分球。使用 ENUM 类型可以限制字段的取值,确保数据的一致性。
  7. action_type:

    • 类型:ENUM('Layup', 'Dunk', 'Jump Shoot', 'Hook Shoot', 'Fadeaway')
    • 属性:NOT NULL
    • 说明:记录具体的投篮动作,如上篮、扣篮、跳投等。同样使用 ENUM 类型来限制取值范围。
  8. team_id:

    • 类型:INT
    • 属性:NOT NULL
    • 说明:记录球员所属球队的 ID。使用整数类型可以提高查询和索引的效率。
  9. game_id:

    • 类型:INT
    • 属性:NOT NULL
    • 说明:记录投篮发生的具体比赛的 ID。使用整数类型可以提高查询和索引的效率。
  10. shot_date:

    • 类型:DATE
    • 属性:NOT NULL
    • 说明:记录投篮发生的日期。使用 DATE 类型可以方便地进行日期相关的查询和排序。
  11. distance:

    • 类型:INT
    • 属性:NOT NULL
    • 说明:记录投篮的距离,单位为英尺。使用整数类型可以方便地进行数值计算和比较。
  12. game_time:

    • 类型:TIME
    • 属性:NOT NULL
    • 说明:记录投篮发生的具体时间,即比赛开始后的具体时间。使用 TIME 类型可以方便地进行时间相关的查询和排序。
  13. time_left:

    • 类型:TIME
    • 属性:NOT NULL
    • 说明:记录投篮发生时距离比赛结束的时间,单位为分钟和秒。使用 TIME 类型可以方便地进行时间相关的查询和排序。
  14. season:

    • 类型:VARCHAR(10)
    • 属性:NOT NULL
    • 说明:记录投篮发生的赛季,格式为 YYYY-YY,如 2022-23。使用 VARCHAR 类型可以存储这些简短的字符串。
  15. 外键约束:

    • FOREIGN KEY (team_id) REFERENCES teams(team_id):球队ID 外键,关联球队表。
    • FOREIGN KEY (game_id) REFERENCES games(game_id):比赛ID 外键,关联比赛表。
    • 说明:使用外键可以确保数据的一致性和完整性,避免出现孤立的数据记录。例如,如果某个球队或比赛不存在,那么对应的投篮记录也无法插入到数据库中。

🐟设计原因

  1. 主键和唯一性

    • shot_id 作为主键,确保每条记录都有一个唯一的标识符。使用 AUTO_INCREMENT 可以自动为每条新记录生成一个唯一的 ID,简化了数据插入的操作。
  2. 数据类型

    • 选择合适的数据类型可以确保数据的准确性和效率。例如,使用布尔类型存储布尔值,使用 ENUM 类型限制取值范围,使用 DATE 和 TIME 类型存储日期和时间。
  3. 外键约束

    • 使用外键可以确保数据的一致性和完整性,避免出现孤立的数据记录。例如,team_id 和 game_id 分别引用 teams 表和 games 表的主键,确保这些字段的值是有效的。
  4. 枚举类型

    • 使用 ENUM 类型可以限制某些字段的取值范围,确保数据的规范化和一致性。例如,shot_type 和 action_type 字段使用 ENUM 类型。
  5. 时间字段

    • 使用 DATE 和 TIME 类型分别记录投篮日期和时间,方便进行时间相关的查询和分析。

🐟END

通过学习和设计 NBA 赛季投篮数据表 shots,我们不仅掌握了如何合理选择数据类型、使用外键约束和枚举类型,还确保了数据的准确性和一致性。作为一名前端工程师,了解这些后端数据库的设计原理和实践方法,有助于我们在前端应用中更高效地处理和展示数据。

现在,大家通过学会这个表的设置,可以进一步发挥你的想象力,设计其他类型的篮球数据表,如传球数据表、抢断数据表等。通过类似的方法,你可以为各种篮球统计数据创建结构合理、易于查询的数据表,从而更好地支持数据分析和应用开发。