1

私は野球の統計の表を持っています、これは次のようなものです:

CREATE TABLE batting_stats(
    ab                INTEGER,
    pa                INTEGER,
    r                 INTEGER,
    h                 INTEGER,
    hr                INTEGER,
    rbi               INTEGER,
    playerID          INTEGER,
    FOREIGN KEY(playerID) REFERENCES player(playerID)
);

しかし、基本的にまったく同じ統計の表がありますが、チームの場合は次のようになります。

CREATE TABLE team_batting_stats(
    ab                INTEGER,
    pa                INTEGER,
    r                 INTEGER,
    h                 INTEGER,
    hr                INTEGER,
    rbi               INTEGER,
    teamID            INTEGER,
    FOREIGN KEY(teamID) REFERENCES team(teamID)
);

私の最初の本能は、外部キーを廃棄してIDを一般化することですが、それでも問題があります。これら2つのテーブルがあり、IDが重複することはありません。

CREATE TABLE player(
    playerID    INTEGER PRIMARY KEY,
    firstname   TEXT,
    lastname    TEXT,
    number      INTEGER,
    teamID      INTEGER,
    FOREIGN KEY(teamID) REFERENCES team(teamID)
);

CREATE TABLE team(
    teamID      INTEGER PRIMARY KEY,
    name        TEXT,
    city        TEXT,
);

この問題を解決し、統計を1つのテーブルに減らすことができる明らかな何かを見落としているような気がします。

4

2 に答える 2

1

データの構造と、データを取得しようとしているもの (および方法) を再検討する必要があります。チームがメジャー リーグ クラブのように「恒久的」であるか、リトル リーグ チームのように一時的なものであるかには違いがあります。前者は後者よりも簡単ですが、後者の解決策は前者にも有効です。

また、データをどのように正規化するかを決定する必要があります。どの打者がどの投手に直面したかを知っている場合、投手の統計は打率から導き出すことができますが、これはおそらく価値があるよりも複雑です.

アトミック アイテムは、プレーヤー、チーム、およびゲームです。トレードは発生しますが、6 回と 7 回の間には発生しないと推測しています。つまり、ゲームはチームとプレイヤーをつなぐものです。

したがって、次のようなテーブルが得られます。

PlayerID   Name    Dog's Name
   1       Fred     Fluffy
   2       Joe      Spike

TeamID    Name      Mascot
   1      Chicago   Comets
   2      Timbuktu  Pussy Cats

GameID    Date        Location     Season
   1      2012-18-12  Over there    2012
   2      2011-20-4   The Park      2011

GameID    PlayerID   TeamID     AllTheStatsFromThisPlayerAtThisGame
   1         1          1
   1         2          2

プレーヤーの統計は、彼がプレイしたすべてのゲームのコレクションです。チーム統計は、すべてのゲームのチーム内のすべてのプレーヤーのコレクションです。

于 2012-12-20T05:02:05.563 に答える
1

統計を 1 つのテーブルに減らしたい場合は、いくつかの関係テーブルを追加して、打者またはチームを統計テーブルにリンクできます。

エンティティ テーブル:

CREATE TABLE stats(
    statsID          INTEGER primary key,
    ab                INTEGER,
    pa                INTEGER,
    r                 INTEGER,
    h                 INTEGER,
    hr                INTEGER,
    rbi               INTEGER
);

CREATE TABLE player(
    playerID    INTEGER PRIMARY KEY,
    firstname   TEXT,
    lastname    TEXT,
    number      INTEGER,
    teamID      INTEGER,
    FOREIGN KEY(teamID) REFERENCES team(teamID)
);

CREATE TABLE team(
    teamID      INTEGER PRIMARY KEY,
    name        TEXT,
    city        TEXT,
);

打者/チームを統計にリンクする関係表:

CREATE TABLE batting_stats(
    playerID integer not null REFERENCES player(playerID),
    statsID integer not null REFERENCES stats(statsID),
    primary key (playerID, statsID)
);

CREATE TABLE team_batting_stats(
    teamID integer not null REFERENCES team(teamID),
    statsID integer not null REFERENCES stats(statsID),
    primary key (teamID, statsID)
);
于 2012-12-20T05:21:06.490 に答える