複数のテーブルに値が格納されるデータベーステーブルを設計しました。これらはすべて、1つのテーブルへのクエリを介して実現できます。
私の質問は、重複データを保存せずに常にクエリを実行すること、または必要なクエリの数を減らすために小さな値を複数回保存することをお勧めしますか?
コンテキストとして、SQLAlchemyとSQLiteを使用して韓国語の質問をクイズするPythonアプリを作成しています。
ユーザー、クイズ、質問のクラスがあります。
問題の値は、クイズの質問に関してはnum_correct、num_wrongです。
基本的に、quiz_idによるクイズに関連するすべての質問を格納する質問テーブルがあります。各質問には、その質問が正しく回答されたかどうかを示すブール値を格納する「正しい」列があります。
私の「クイズ」テーブルには、そのクイズで回答された質問に関するnum_correct / num_wrongの列があります。
私の「ユーザー」テーブルには、常に正解と不正解の合計に関するnum_correct / num_wrongの列もあります。
「クイズ」の値を取得するには「質問」テーブルにクエリを実行し、「ユーザー」の値を取得するには同じことができることに気付きました。
この場合(そして一般的に)、ベストプラクティスを考慮した場合に推奨される戦略はどれですか?
私はグーグルをかなり試しましたが、質問の言い回しは少し注意が必要です。
重複データの問題は、リレーショナルデータベースでは複雑です。アプリケーションがデータの変更を行っている場合、データが重複すると同期の問題が発生します。データは複数の場所で更新する必要があります。
これはさまざまな理由で悪いことです。
データベースは、ACIDプロパティ、トランザクション、およびトリガーを介して、この機能をサポートします。ただし、オーバーヘッドが追加されます。一般に、このような複製は、事前にではなく、必要に応じて(つまりパフォーマンス)追加されます。したがって、更新が頻繁に発生するときに情報が1回だけ保存される、正規化されたデータモデルが強く優先されます。
一方、一部のデータベースは主にクエリの目的で使用されます。これらのデータベースはしばしば非正規化されます-そしてかなりそうです。たとえば、顧客テーブルには、多くの異なるディメンションに沿った要約が含まれ、数十の基礎となるテーブルから情報を収集する場合があります。
これにより、クエリが簡素化されるだけでなく、ビジネスロジックがエンコードされます。データの使用に関する大きな問題の1つは、人によって定義がわずかに異なることです。1年の顧客は、365日前に始めた人ですか。去年の同じ日に始めた人はいますか?12ヶ月間存在している人はいますか?標準化された分析テーブルがその答えを提供します。
あなたのケースは最初の状況にもっと陥っているようです。あなたは更新を行っており、要約を前もって保存することを考えています。私はあなたがこれをするのを思いとどまらせます。データを要約するために必要なクエリを書くだけです。おそらく、インデックスとパーティショニングは、必要なすべてのパフォーマンスを提供します。
何百万ものユーザーが何十もの質問で何百ものクイズを受験することを前もって知っている場合は、パフォーマンスの最適化について前もって検討することをお勧めします。しかし、数十の質問で少数のクイズを受験する何千人ものユーザーの場合は、単純なデータモデルから始めて、それが機能することを実証した後、より複雑にします。
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加