2

我在規劃我的MySQL數據庫的以下情形的過程 -使用0/NULL值標準化還是可以設計得更好?

我試圖建立由遊戲系統,比如NBA的一齣戲,其中,事件如

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] 

但是假設在一個特定分鐘只有三個事件之一即告發生─只有一個事件記錄了三個將有ID,和OT鏈接她的將是0或NULL。我留下的問題是這個設計的正常化還是有更好的方法來做到這一點?

+0

對於play_by_play記分卡,您需要連接表格並獲取所需的數據。這應該是一個觀點,而不是一張桌子。 –

+0

謝謝你的回覆,你說得對,我可以加入表格。然而,我的問題是,如果我必須插入Play by Play記錄,它看起來像這樣[1,10,5,0,1,0]意味着其中只有一個事件在特定時間獲得記錄,並且我被迫進入0代表其他事件。你能否建議我如何使這個設計更好? – siva

+0

你不應該有一張桌子叫做玩,對不起,我不明白一個籃球遊戲是如何工作的,但是你應該用一種插入方式來分割你的桌子,只有一個插入只能處理一種類型的事件,並且隻影響事件發生的桌子與之相關,如果你有一張不符合商業模式的表,那麼它不是正確的模式。 –

回答

1

我不認爲只有一個答案,它高度依賴於你如何使用你的數據。

一種方式是有Play_by_Play表包括一個事件的單一引用,從而避免NULL和0的開銷。

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 s並且沒有大事件表。

目前還不清楚什麼是您的實際數據庫引擎(您標記了MySql和SQL Server),但是對於SQL Server,有一項功能可以幫助您優化具有大量NULL值的表的空間:sparse columns

2

如果目標是跟蹤事件,那麼在單個表中關注每個事件的一行。

混合play_typefoul_type成單個type,與substitution as another類型。

考慮將「替換」分成兩個事件:玩家被移除並且玩家被添加。這消除了僅用於該事件的額外玩家列。 (但是如果你想把它稱爲單一事件,它會使事情變得複雜。)

可能需要少量的NULLable列。

相關問題