2017-07-16 91 views
0

我有一個表test_cases其作爲連接表的buildstests並存儲有關測試的durationresult信息(如:'success''failure''time_out'),並在情況下,error_message的test_case失敗:我的數據庫應該有一個表還是兩個表?

test_cases 
---------- 
test_case_id - integer (primary key) 
build_id  - integer (foreign key) 
test_id  - integer (foreign key) 
duration  - integer 
result  - string 
error_message - string 

有很多時候error_message將是空白的(可能是99%+時間百分比)。值得在另一個表中存儲關於test_case失敗的信息嗎?也許是這樣的:

test_case_failures 
---------- 
test_case_failure_id - integer (primary key) 
test_case_id   - integer (foreign key) 
error_message   - string 

在生產中會出現幾千萬的test_cases表中的行,會是什麼利弊,這兩種方法是什麼?

+1

」將爲空白(大概99%+時間百分比)「 - 在這種情況下,我可能會創建一個單獨的表格。但跳過'test_case_failure_id'列並使用'test_case_id'作爲PK和FK。 –

+2

我刪除了不兼容的數據庫標籤。 –

回答

2

是否有另一張表應該基於您如何使用數據和數據的大小。這裏有些例子。

一般而言,存儲NULL錯誤消息幾乎不使用額外的空間(取決於數據庫)。

如果error_message真的很大,那麼它可能會擴大99%的案例大小。因此,任何數據的使用可能需要更長的時間。

如果錯誤測試開始有其他信息 - 尤其是數字和日期/時間 - 那麼它們(通常)會佔用空間,即使它們是NULL。將這些失敗放在另一張桌子上是一個有力的論據。

如果您正在對錯誤進行大量分析並且成功率很低,那麼成功記錄將會限制查詢。這是第二張桌子的另一個說法。

但是,由於外鍵引用,我建議將所有測試用例放在同一個表中。這給您提供了三個關於錯誤特定信息的選項:

  • 將該信息留在同一個表中。
  • 將該信息留在同一個表中,但將這些記錄放入單獨的分區中。您需要了解數據庫中的分區。
  • 將只有錯誤的信息放在另一個表中,也許該表的主鍵是對test_cases的外鍵引用。

另外,Postgres有另外一個選擇,就是使用繼承。

這些方法都不比其他方法「更好」。它們都是表示數據的可行方法。哪種效果最好取決於數據將如何使用以及數據的大小。

+0

非常詳細的回答@戈登,謝謝 – George

4

我認爲分配如此重要的優化問題是不明智的,因爲這樣的問題足以讓你煩惱地問你一個關於它的stackoverflow問題。

做什麼是最簡單的,如果您確定了實際使用情況下的性能問題,那麼重構一下。

最簡單的辦法就是隻使用一個表,並使錯誤消息列可爲nvarchar nvarchar。並且猜猜看,這不會對性能產生不利影響,因爲在大多數RDBMS中,這樣一個具有空值的字段將在該行中佔據一個位。 「

+0

我對這種差異感到好奇,我認爲這就足以提出一個問題 – George

+0

好吧,好吧,爲了百科知識。 –

+0

我認爲你對過早的重構是正確的,儘管 – George

相關問題