Может ли атрибут обозначать одну таблицу над другой? - PullRequest
1 голос
/ 21 декабря 2009

Я создаю базу данных спортивной статистики. С его помощью я бы хотел каталогизировать статистику игр / матчей для многих видов спорта. Например, эта база данных сможет рассказать вам, сколько приземлений Каролина Пантерс забило в сезоне 09-10 (футбол), или сколько штрафных бросков было сделано Майами Хит в их последней игре (баскетбол).

У меня проблемы с проектированием одной из более фундаментальных таблиц под названием «Совпадения». Таблица соответствий имеет столбцы для:

  • ID (PK match_id )
  • дата воспроизведения ( play_date )
  • идентификаторы, относящиеся к выступлениям команд (FK team_1_performance_id и team_2_performance_id ) в таблице выступлений.

Таблица исполнений содержит:

  • ID (PK perf_id )
  • идентификатор команды (FK team_id )
  • И самое главное, все остальные характеристики, такие как: количество ударов (*)
  • средний бросок за игру (*)
  • процентов из 3-х указателей сделано (*)

(*) Проблема в том, как я могу сделать таблицу выступлений релевантной для соответствующего вида спорта? Например, в бейсбольных матчах есть забастовки, а в футболе и хоккее - нет (равно как и в любом другом виде спорта, о котором я могу думать). Я не хочу, чтобы в моей таблице «Производительность» был столбец для ударов, когда он будет иметь отношение только к части записей.

Или я? Может быть, мой дизайн должен отличаться все вместе? Как бы вы пошли об этом?

Теперь, я не знаю, возможно ли это, но одна идея, которая у меня возникла, заключалась в том, чтобы включить какой-то столбец идентификатора таблицы производительности в Matches, который ссылается на разные таблицы производительности. Так что, когда я запрашиваю результаты матча, он смотрит на конкретную таблицу. Отсюда и название этого вопроса (может ли атрибут обозначать одну таблицу над другой?). Представьте себе: «ВЫБЕРИТЕ team_1_performance.strikes ИЗ МАТЧЕЙ ВНУТРЕННЕГО СОЕДИНЕНИЯ Соответствует

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

Если можете, постарайтесь, чтобы ваши ответы были специфичными для MySQL.

Спасибо!

Ответы [ 4 ]

2 голосов
/ 21 декабря 2009

Вместо скрещивания создайте данные, идущие вниз.

Так что вы бы

Таблица исполнений содержит:

  • ID (PK perf_id )
  • идентификатор команды (FK team_id )
  • Тип характеристики производительности
  • Значение показателя производительности

Или что-то в этом роде.

Затем вам также нужно будет создать таблицу Rules , которая свяжет конкретные Типы статов производительности с конкретными Типами спорта .

Это также позволит вам легко добавлять новые Типы статов производительности без существенного влияния на схему базы данных.

Затем вы можете также реализовать порядок отображения или даже отображение групп, если хотите.

2 голосов
/ 21 декабря 2009

Создайте таблицу " Metrics " (или " Stats "), которая определяет различные вещи, которые вы будете измерять.

  Table Metrics
    MetricId int,
    MetericName (Runs Batted In, Touchdowns, FreeThrows, etc.)
    MetricAbbreviation Nullable?
    Sport (That Metric belongs to )

Тогда ваша таблица MatchStatistics будет иметь

  Table MatchStatistics
    MatchId   
    MetricId
    MetricValue Decimal

PK в этой таблице будет MatchId и MetricId. Вы также можете иметь таблицу PlayerStatistics, которая будет выглядеть аналогично, за исключением того, что в ней будет PlayerId вместо MatchId

1 голос
/ 21 декабря 2009

Ваша идея создать спортивные таблицы, как правило, то, что сделано.

0 голосов
/ 21 декабря 2009

Если вы идете с Астандером, вот запрос, который вам понадобится для всех побед Каролины, когда набрано больше приземлений, чем перехватов.

Если бы вы сделали это правильно, в столбцах вы бы увидели

SELECT * FROM Football_stats  fs
WHERE fs.team_fk = (something that resolves to Carolina)
fs.outcome = 'Win' And fs.touchdowns > fs.interceptions

в мире EAV вы получите

SELECT game_id FROM football_stats WHERE fs.team_fk = [Carolina] and stat_type = 'Outcome' and stat_value = 'Wins')
INTERSECT
SELECT game_ID FROM 
  (SELECT game_id, stat_value FROM football_stats WHERE fs.team_fk = [Carolina] and stat_type = 'Touchdown' ) tds,
  (SELECT game_id, stat_value FROM football_stats WHERE fs.team_fk = [Carolina] and stat_type = 'Interceptions') ints
WHERE
  tds.stat_value > ints.stat_value

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

...