Как структурировать базу данных для реляционной? данные - PullRequest
1 голос
/ 13 января 2010

Мне нужно следить за набранными очками и против кого они набрали. Раньше я делал это, используя базу данных с плоскими файлами (которая была беспорядочной), которая выглядела так:

03611100025
00001000000
21011000000
00003000000
00021000000
10001050000
00001402000
00001000100
00001013050
00001000100
00001000000

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

Я чувствую, что, должно быть, мне не хватает другого, более радикально более легкого метода, чтобы сделать это Кто-нибудь может протянуть руку?

Ответы [ 2 ]

5 голосов
/ 13 января 2010

Имеют 2 стола: «Команда и игра», где у команды есть название команды и идентификатор команды, а в игре 2 идентификатора команды (команда 1 и команда 2) и счет игры. Затем у вас есть внешние ключи (для целостности) между таблицами Game и Team. Это будет отражать, кто играл, кто и что получил, с минимальной схемой и очень простой структурой.

Team
|-------------------------|
| Primary (int)| id       |
|         (chr)| name     |
|-------------------------|

Game
|-------------------------|
| Primary (int)| team1    |
| Primary (int)| team2    |
|         (int)| score1   |
|         (int)| score2   |
|-------------------------|

Итак, некоторые примерные данные будут выглядеть так:

Team
|------------------|
| id | name        |
|------------------|
|  1 | Blue Devils |
|  2 | Cardinals   |
|  3 | Fish        |
|  4 | Lemmings    |
|------------------|

Game
|---------------------------------|
| team1 | team2 | score1 | score2 |
|---------------------------------|
|     1 |     2 |      7 |      8 |
|     1 |     4 |      2 |     25 |
|     2 |     3 |      8 |      2 |
|     3 |     4 |     17 |     18 |
|---------------------------------|

Эти данные указывают на то, что команда 1 (Синие дьяволы) играла в команде 2 (кардиналы) со счетом от 7 до 8. Остальные данные похожи.

Если вам не нужно отслеживать названия команд, вы можете пропустить это поле, но это часто полезная информация.

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

SELECT * FROM Game g 
 INNER JOIN Team t on t.team1 = g.id

Затем вы также можете добавить дополнительную информацию, например, когда игра состоялась (дата), и любую другую информацию, такую ​​как другие статистические данные об игре или команде.

1 голос
/ 14 января 2010

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

Если вы используете структуру «Команда и игра» из ответа, вы все равно можете преобразовать эту структуру в структуру, которую вы себе представляли в своем вопросе. Этот процесс называется «перекрестной таблицей» или «поворотом», и он хорошо документирован в руководствах.

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

...