2017-07-16 3 views
0

Iはbuildstestsための結合テーブルとして機能するテーブルtest_casesを有し、また、試験のdurationresultに関する情報を格納する(例えば'success''failure''time_out')及び場合error_message test_caseに失敗しました:データベースには1つまたは2つのテーブルが必要ですか?

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

別のテーブルがあるかどうかは、データの使用方法とデータのサイズに基づいている必要があります。下記は用例です。

一般に、エラーメッセージを格納するには、データベースに応じてスペースをほとんどまたはまったく使用しません。

error_messageが本当に大きい場合は、ケースの99%のサイズが大きくなる可能性があります。したがって、データの使用はすべて時間がかかる可能性があります。

エラーテストで数字や日付/時刻などのその他の情報が開始された場合は、NULLであっても(通常は)スペースを占有します。それは、失敗を別のテーブルに入れるための強力な議論になります。

エラーについて多くの分析を行い、成功にほとんど影響しない場合は、成功記録によってクエリが抑制されます。それは2番目のテーブルの別の引数です。

しかし、外部キー参照のため、すべてのテストケースを同じテーブルに入れることをお勧めします。これにより、エラー固有の情報に関する3つのオプションが表示されます。

  • この情報を同じテーブルに残しておきます。
  • 同じ情報を同じテーブルに残しますが、それらのレコードは別々のパーティションに入れてください。データベースのパーティション化について学ぶ必要があります。
  • エラー専用の情報を別のテーブルに入れます。恐らくそのテーブルの主キーはtest_casesへの外部キー参照です。

さらに、Postgresには、継承を使用する別の方法があります。

これらの方法のどれもが他の方法より "良い"ものではありません。それらはすべてデータを表現する実行可能な方法です。どちらが最適かは、データの使用方法とデータのサイズによって異なります。

+0

非常に徹底的な答え@ gordon、ありがとう – George

4

私は、このような質問は、それについてのstackoverflowの質問をするのに十分なことを気にするように最適化の懸念に非常に重要性を割り当てることは賢明ではないと思う。

最も簡単なことは何ですか。また、実際の使用状況でパフォーマンスの問題がある場合は、リファクタリングを行います。

最も簡単なのは、単一のテーブルを使用して、エラーメッセージ列nullable nvarcharにすることです。ほとんどのRDBMSでは、そのようなヌル値を持つフィールドは、その行のただ1つのビットを占有するため、パフォーマンスに悪影響を与える可能性は低いと考えられます。

+0

私は違いについて興味があった、私は質問を投稿する理由が十分だと思う。 – George

+0

まあ、百科事典の知識のために。 –

+0

あなたは時期尚早のリファクタリングについて正しいと思いますが – George

関連する問題