Эта база данных выглядит нормально? Я нормально нормализовался? - PullRequest
1 голос
/ 28 декабря 2011

У меня есть необходимость создать базу данных для некоторых данных, которые у меня есть, и поэтому я взялся за нее (как вы надеетесь), и теперь мне нужна помощь, чтобы завершить ее!Можете ли вы помочь мне нормализовать это?

Я сделал снимок дизайна, созданного в Excel, используя поддельные данные :

enter image description here

ЧтоВы должны знать, что в некоторые игры будут сыграны 5 на 5, а в некоторые - 3 на 3.Вместо того, чтобы добавлять столбцы для Team1P1, Team1P2, Team1P3 и т. Д., Я хотел оставить это на усмотрение экспертов, чтобы помочь мне сделать это.

Вопрос: На основании моего анализатора файлов мойПриложение будет знать, есть ли в игре 6 игроков (3 на 3) или 10 (5 на 5).Как я могу структурировать базу данных, чтобы отобразить этих игроков обратно в игру?Вместо того, чтобы пытаться поместить данные Player в таблицу Games, я должен добавить в Players столбец, который указывает на Game ID?

Игроков :
id |player_id |game_id |и т.д. ...

Редактировать для уточнения

Изображение Starcraft 2 или любая другая игра в жанре RTS, в которую играют онлайн.Когда игра начинается, это совершенно новый планшет.Определенное количество игроков присоединяются к матчу (3 на 3 или 5 на 5) и играют друг против друга.В конце игры у каждого есть определенные значения статов (выиграли или проиграли? Сколько золота у них было? Сколько убийств, смертей, ассистов у них было?)

Каждая из этих характеристик специфичнаэтому игроку в этой игре.

Если я буду играть в 2 игры в тот день, я буду выглядеть так:

id |player_id |stat1 |stat2 |stat3 |
1 |100 |500 |600 |700
2 |100 |300 |999 |2000

Ответы [ 3 ]

2 голосов
/ 28 декабря 2011

Я в основном согласен с ответом PeeHaa, хотя у меня есть пара изменений. Во-первых, я согласен, что поля id в обеих предлагаемых вами таблицах pr0tocol сбивают с толку, поскольку у вас также есть поля game_id и player_id. Просто используйте их.

Я также согласен с тем, что у вас должна быть отдельная таблица game_players, состоящая исключительно из game_id и player_id, и оба эти поля вместе являются первичным ключом таблицы.

Я чувствую, что ваша таблица stats должна иметь те же ключи, что и таблица game_players. Таким образом, вы не только отслеживаете статистику каждого отдельного игрока, но и имеете возможность сообщать статистику по отдельным играм.

Edit:

Игры:

  key
game_id  |  game_length  |  game_mode  |  game_type  |  ranked

Игроки:

   key
player_id  |  other player data - no stats in here

Game_Players

  key    |     key
game_id  |  player_id

Статистика

  key    |     key
game_id  |  player_id  |  stat1  |  stat2  |  stat3  |  etc...

Используя эти четыре таблицы, вы можете отслеживать все статистические данные и иметь возможность разделять их в зависимости от игрока или игры по любым отчетам, которые вы решите написать. Теперь не имеет значения, сколько игр назначено отдельному игроку, поскольку это только часть ключа в соответствующих таблицах.

2 голосов
/ 28 декабря 2011

Я бы сделал еще один стол для отображения игроков и игр.

Я также заметил, что у вас есть статистика в таблице игроков.

Может быть, лучше выбрать другую таблицу для статистики игрока. Таким образом, вам не нужно менять таблицу, если вы хотите добавить какую-либо другую статистику в будущем.

Таблица game_players:

game id // PK
player id // PK

Статистика таблиц:

id
player id
type (e.g. stat1)
stat
0 голосов
/ 28 декабря 2011
Game
----
GameId
Length
Mode
Type
Ranked
PRIMARY KEY (GameId)

Team
----
TeamId
TeamName (only if you need it)
... other stuff about team
PRIMARY KEY (TeamId)

Player
------
PlayerId
PlayerName
... other stuff about player
PRIMARY KEY (PlayerId)

И какой игрок участвует в какой команде:

TeamPlayer
----------
TeamId
PlayerId
PRIMARY KEY (TeamId, PlayerId)
FOREIGN KEY (TeamId)
  REFERENCES Team(TeamId)
FOREIGN KEY (PlayerId)
  REFERENCES Player(PlayerId)

и какие команды в какой игре:

GameTeam
--------
GameId
TeamId
PRIMARY KEY (GameId, TeamId)
FOREIGN KEY (GameId)
  REFERENCES Game(GameId)
FOREIGN KEY (TeamId)
  REFERENCES Team(TeamId)

и статистика:

GamePlayerStatistics
--------
GameId
TeamId
PlayerId
... statistics columns per player per game
PRIMARY KEY (GameId, PlayerId)
FOREIGN KEY (GameId, TeamId)
  REFERENCES GameTeam(GameId, TeamId)
FOREIGN KEY (TeamId, PlayerId)
  REFERENCES TeamPlayer(TeamId, PlayerId)

Если во всех ваших играх ровно 2 команды, таблицу GameTeam можно удалить. Затем вам понадобятся два столбца в Game, скажем Team1Id и Team2Id в качестве внешних ключей для Team, а также некоторые модификации таблицы Statistics.

...