2

Я нахожусь в процессе планирования моей БД в MySQL для следующего сценария -Нормализация с 0/NULL значениями или может быть спроектирована лучше?

Я пытаюсь построить пьесу системы игры, такие как НБ, где такие события, как

Play event[id, play_type_id, play_outcome_id, points] 

    Substitution event[id, player1_in_id, player2_out_id] 

    Foul event[id, foul_type_id, player_id] 

В основном play_by_play показателей конкретное событие должно быть связано с конкретным временем и матч

Play_by_Play[id, match_id, time_id, play_event_id, substitution_event_id, foul_event_id] 

Однако если предположить на одной конкретной минуты только один из трех событий принимает место- только одну запись событий из трех будет иметь идентификатор, и О.Т. у нее будет 0 или NULL. Я остался с вопросом, является ли эта нормальная нормализация для этого дизайна или есть лучший способ сделать это?

+0

Для игровой системы play_by_play вам необходимо объединить таблицы и получить требуемые данные. Это должно быть представление не таблицы. –

+0

Благодарим вас за ответ. Вы правы, я мог бы присоединиться к столам. Однако моя проблема заключается в том, что если мне нужно вставить запись Play Play, это выглядит следующим образом: [1,10,5,0,1,0] означает, что только одно из событий среди участников получает запись в определенное время, и я вынужден войти 0 для других событий. Можете ли вы предложить, как я могу сделать этот дизайн лучше? – siva

+0

У вас не должно быть таблицы под названием play by play, жаль, что я не понимаю, как работает баскетбольная игра, но вы должны разделить свои таблицы так, чтобы одна вставка только обрабатывала один тип событий и влияла только на таблицу, связанный с, если у вас есть таблица, которая не соответствует бизнес-модели, то это не правильная схема. –

ответ

1

Я не думаю, что есть только один ответ, и он сильно зависит от того, как вы используете свои данные.

В одной из таблиц есть таблица Play_by_Play, содержащая отдельную ссылку на событие и, таким образом, избегая накладных расходов с помощью NULL и 0s.

Play_by_Play[id, match_id, time_id, event_id] 

Вы можете определить общий случай

Event_type [event_type_id, type_name] 
Generic_Event[event_id, event_type_id] 

и все другие типы событий могут быть 1: 1 Расширения для этого общего типа события:

Play event[id, event_id, play_type_id, play_outcome_id, points] 
Substitution event[id, event_id, player1_in_id, player2_out_id] 
Foul event[id, event_id, foul_type_id, player_id] 

Такая конструкция способствует нормализации и позволяет быстро выбирать информацию о событиях независимо от их типа (для вашего проекта требуется несколько объединений).

Однако для агрегирования информации потребуется больше объединений (для таблиц, на самом деле содержащих релевантные данные для событий), а также Generic_Event может сильно возрасти с потенциальными последствиями для производительности.

Ваш путь способствует более быстрой агрегированию информации, так как вы можете запросить только Play_by_Play стол. Например: получите количество замен и количество фолов в течение периода времени.

Это может привести к увеличению количества пробелов и выполнению запросов, поскольку вы используете меньше JOIN и не имеете большой таблицы событий.

Непонятно, каков ваш фактический движок базы данных (вы отметили как MySql, так и SQL Server), но для SQL Server есть функция, которая помогает вам оптимизировать пространство для таблиц с большим количеством значений NULL: sparse columns.

2

Если целью является отслеживание событий, то сосредоточьтесь на одной строке на событие в одной таблице.

Смесь play_type и foul_type в одном type, с substitution as another типа`.

Рассмотрите разделение «замещения» на два события: Игрок удален и добавлен игрок. Это устраняет дополнительный столбец игрока, который существует только для этого события. (Но это усложняет ситуацию, если вы хотите назвать это одним событием.)

Возможно, потребуется небольшое количество столбцов NULLable.