AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / dba / 问题 / 171771
Accepted
John Biddle
John Biddle
Asked: 2017-04-24 10:33:58 +0800 CST2017-04-24 10:33:58 +0800 CST 2017-04-24 10:33:58 +0800 CST

更多字段或多个表

  • 772

我经营多个撞球联盟,并一直将信息保存在 excel 中。我正在努力将其移至网络并使用 MySQL 获取数据。matches 表中的数据量最大,包含每场比赛的信息。

我有多个基于不同游戏的联赛,直池,一个口袋,9 球和 8 球。每场比赛都有一些特定的领域,例如直池中的高位奔跑,但没有其他领域,8 球和 9 球中的突破和奔跑,但其他两个没有,8 球中的突破,但没有其他领域,等等。

我可以将所有这些字段放在一个表中,并有一个名为“游戏”的字段,用于标记该记录是关于哪个游戏的。或者,我可以为每场比赛准备一张桌子,其中包含该比赛所需的所有字段。

单桌,如果我走那条路,一开始会很小,但如果我能够扩大我拥有这些联赛的地方的数量,记录的数量可能会在几年内增加到 20,000 或更多。

哪种方式最好?

PS 我不设想在同一查询中运行查看多个游戏记录的查询。

mysql database-design
  • 1 1 个回答
  • 113 Views

1 个回答

  • Voted
  1. Best Answer
    joanolo
    2017-04-24T11:25:40+08:002017-04-24T11:25:40+08:00

    如果您的查询事先知道您指的是哪种类型的游戏,并且您每次查询只有一个游戏,那么最简洁的方法很可能是为不同的游戏设置不同的代理表,并且始终JOIN在主表中包含一个特定的适合您的游戏类型。

    例如,您将拥有一张包含所有不同类型游戏的表格:

     CREATE TABLE games
     (
          game_id integer PRIMARY KEY,
          game_name varchar(100) NOT NULL
     ) ;
    
     INSERT INTO games 
         (game_id, game_name)
     VALUES 
        (1, 'straight pool'),
        (2, 'one pocket'),
        (3, '9 Ball'),
        (4, '8 Ball') ;
    

    球员表(可能还有联赛、赛季等)

     CREATE TABLE players
     (
         player_id integer PRIMARY KEY, -- probably autoincrement
         player_name varchar(100)
     ) ;
    
     INSERT INTO players
        (player_id, player_name)
     VALUES
        (1, 'Player 1'),
        (2, 'Player 2'),
        (3, 'Player 3'),
        (4, 'Player 4') ;
    

    你的匹配表:

     CREATE TABLE matches
     (
          match_id integer PRIMARY KEY, -- probably autoincrement
    
          game_id integer NOT NULL REFERENCES games (game_id),
          player_1_id integer NOT NULL REFERENCES players (player_id),
          player_2_id integer NOT NULL REFERENCES players (player_id),
          match_date date NOT NULL,
          -- probably a league_id
          -- probably a season_id 
          -- some other data common to all matches
    
          UNIQUE (game_id, player_1_id, player_2_id, match_date)  -- Alternate key
     ) ;
    

    然后,对于每个特定的游戏类型,一个包含所有有意义的列的表格:

     CREATE TABLE straight_pool_matches
     (
        match_id integer REFERENCES matches(match_id),
        -- Don't know enough to know what to put here
        info_about_straight_pool_matches varchar(255)
     ) ;
    

    所以,让我们想象一下,2017 年 1 月 1 日,玩家 1 和 2 之间有一场“直池”比赛。您可以将数据添加到两个表中:

     INSERT INTO matches
         (match_id, game_id, player_1_id, player_2_id, match_date)
     VALUES
         (1, 1, 1, 2, '2017-01-01') ;
    
     INSERT INTO straight_pool_matches
         (match_id, info_about_straight_pool_matches)
     VALUES
         (1, 'Something that makes sense about a straing pool match') ;
    

    您执行查询的方式很可能是:

     SELECT 
         m.match_id, p1.player_name AS player_1, p2.player_name AS player_2, m.match_date,
         s.info_about_straight_pool_matches
     FROM 
         matches m
         JOIN players p1 ON p1.player_id = m.player_1_id
         JOIN players p2 ON p2.player_id = m.player_2_id
         JOIN straight_pool_matches s ON s.match_id = m.match_id 
     WHERE
         m.game_id = 1 
     ORDER BY
         m.match_date, m.match_id ;
    

    匹配ID | 玩家_1 | 玩家_2 | 匹配日期 | info_about_straight_pool_matches
    ------: | :-------- | :-------- | :-------- | :------------------------------------------------ --- 1 | 玩家 1 | 玩家 2 | 2017-01-01 | 紧张的泳池比赛有意义的事情

    dbfiddle在这里

    • 0

相关问题

  • 是否有任何 MySQL 基准测试工具?[关闭]

  • 我在哪里可以找到mysql慢日志?

  • 如何优化大型数据库的 mysqldump?

  • 什么时候是使用 MariaDB 而不是 MySQL 的合适时机,为什么?

  • 组如何跟踪数据库架构更改?

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    连接到 PostgreSQL 服务器:致命:主机没有 pg_hba.conf 条目

    • 12 个回答
  • Marko Smith

    如何让sqlplus的输出出现在一行中?

    • 3 个回答
  • Marko Smith

    选择具有最大日期或最晚日期的日期

    • 3 个回答
  • Marko Smith

    如何列出 PostgreSQL 中的所有模式?

    • 4 个回答
  • Marko Smith

    列出指定表的所有列

    • 5 个回答
  • Marko Smith

    如何在不修改我自己的 tnsnames.ora 的情况下使用 sqlplus 连接到位于另一台主机上的 Oracle 数据库

    • 4 个回答
  • Marko Smith

    你如何mysqldump特定的表?

    • 4 个回答
  • Marko Smith

    使用 psql 列出数据库权限

    • 10 个回答
  • Marko Smith

    如何从 PostgreSQL 中的选择查询中将值插入表中?

    • 4 个回答
  • Marko Smith

    如何使用 psql 列出所有数据库和表?

    • 7 个回答
  • Martin Hope
    Jin 连接到 PostgreSQL 服务器:致命:主机没有 pg_hba.conf 条目 2014-12-02 02:54:58 +0800 CST
  • Martin Hope
    Stéphane 如何列出 PostgreSQL 中的所有模式? 2013-04-16 11:19:16 +0800 CST
  • Martin Hope
    Mike Walsh 为什么事务日志不断增长或空间不足? 2012-12-05 18:11:22 +0800 CST
  • Martin Hope
    Stephane Rolland 列出指定表的所有列 2012-08-14 04:44:44 +0800 CST
  • Martin Hope
    haxney MySQL 能否合理地对数十亿行执行查询? 2012-07-03 11:36:13 +0800 CST
  • Martin Hope
    qazwsx 如何监控大型 .sql 文件的导入进度? 2012-05-03 08:54:41 +0800 CST
  • Martin Hope
    markdorison 你如何mysqldump特定的表? 2011-12-17 12:39:37 +0800 CST
  • Martin Hope
    Jonas 如何使用 psql 对 SQL 查询进行计时? 2011-06-04 02:22:54 +0800 CST
  • Martin Hope
    Jonas 如何从 PostgreSQL 中的选择查询中将值插入表中? 2011-05-28 00:33:05 +0800 CST
  • Martin Hope
    Jonas 如何使用 psql 列出所有数据库和表? 2011-02-18 00:45:49 +0800 CST

热门标签

sql-server mysql postgresql sql-server-2014 sql-server-2016 oracle sql-server-2008 database-design query-performance sql-server-2017

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve