4

我接管了一個存儲健身信息的數據庫,並且我們正在討論某個表以及它應該保持爲一張表還是分成三張表。該數據庫表應該規範化嗎?

今天,有一個名爲一個表:鍛鍊具有以下字段

ID,exercise_id,代表,重量,日期,PERSON_ID

所以,如果我做了3個不同的2套有一天練習,那天我會在那張桌上有6條記錄。例如:

ID,exercise_id,代表,重量,日期,PERSON_ID
1,1,10,100,1/1/2010,10
2,1,10,100,1/1/2010,10
3,1,10,100,1/1/2010,10
4,2,10,100,1/1/2010,10
5,2,10,100,1/1/2010,10
6,2,10,100,1/1/2010,10

所以,問題是,由於有多種一些冗餘數據(日期,PERSONID,exercise_id)記錄,這應該歸到三個表

WorkoutSummary
- ID
- 最新
- 爲person_id

WorkoutExercise
- ID
- workout_id(外鍵WorkoutSummary )
- exercise_id

WorkoutSets
- ID
- workout_exercise_id(外鍵WorkoutExercise)
- 代表
- 重量

我猜的缺點是查詢將這個重構後,反應速度爲現在我們需要連接3個表來執行之前沒有連接的相同查詢。重構的好處使得將來可以在鍛鍊總結級別或鍛鍊級別添加新的字段而無需添加更多重複。

對此辯論有何反饋?

+0

什麼數據庫正在使用? – 2010-05-04 14:39:00

回答

8

不要認爲規範化後查詢速度會變慢。如果表正確索引,加入少量表非常便宜。

另一方面,對非標準化表格的查詢很容易導致速度變慢。例如,在您的原始模式中,僅嘗試查詢鍛鍊完成的不同日期比使用標準化版本要昂貴得多。

在這一點上絕對正常化它。如果您稍後遇到性能問題,那麼您可以選擇性地將數據的某些部分另外反正規化爲已經規範化的模式。但是,很可能你永遠不會用一個小型數據庫達到這一點。

+0

@Aaronaught - 你說「如果表格索引正確」。你在這裏建議索引哪些字段? – leora 2010-04-11 16:32:55

+2

@oo:您應該幾乎總是將外鍵字段(Workout_Exercise中的'workout_id'和'WorkoutSets'中的'workout_exercise_id')編入索引。根據數據庫引擎的不同,您可能希望使這些索引涵蓋部分或全部。我不確定那個'exercise_id'字段是什麼,大概是這種鍛鍊的類型?如果是這樣,如果你打算根據練習類型進行查詢(「John已經跟上了蹲步?」),那麼你可能也需要一個索引。 – Aaronaught 2010-04-11 16:36:36

+0

爲將出現在WHERE子句中的所有主鍵,候選鍵和外鍵添加索引。 – duffymo 2010-04-11 16:42:27

2

新的重構看起來不錯,如果您在各個表上有適當的索引,性能不會受到任何影響。 (索引可以在所有的外鍵創建)

所以YES,這似乎是一個完全正常的重構。