1

私は Rails を初めて使用し、アプリで収入と支出を追跡するモデルを作成する方法を理解しようとしています。するべきか:

1) Finance というモデルとデータベース テーブルを 1 つ作成し、「type」というフィールドを収入または支出のいずれかに設定してから、説明、金額、日付を続けますか?

2) それとも、2 つのモデルと、Income と Expenses という名前の 2 つのテーブルを作成し、それぞれに説明、金額、および日付を指定する必要がありますか?

このデータを使用して、写真家がビジネスに関連する収入と支出を追跡できるようにするつもりです。たとえば、写真家が予約をするときに、収入と支出をその予約に関連付けることができます。また、毎月の収入、支出、利益を示すレポートも表示されます。

4

2 に答える 2

2

1 つのテーブルを使用し、STI を使用します (つまり、タイプ フィールドを使用します)。収入と支出は本質的に同じものであり、操作の「方向」が異なるだけです。したがって、特定のサブタイプに例外を隠して、同じデータ モデルを使用することは理にかなっています。

他の回答で言及されている問題については:

  • 1 つのテーブルで両方の商品を同時に注文するのが簡単になります。2つだと苦しくなる。
  • テーブルを適切にインデックス化する場合、テーブルが 1 つであろうと 2 つであろうと関係ありません。タイプ列にインデックスを作成する場合、レコードのカーディナリティは 2 つのテーブルの場合と同じであるため、パフォーマンスの点でそれほど違いはありません。集計も 1 つのテーブルで簡単かつ高速になります。
  • 何らかの種類のデータベース (MyISAM など) を使用しない限り、テーブルのロックは問題になりません。使用しないでください。
于 2013-02-26T09:19:36.943 に答える
1

基本的には好みの問題です。(UNIONを使用して)1つまたは2つのテーブルを使用してすべてのデータベースクエリを実行できます。したがって、よりクリーンなモデル構造を持つために2つのテーブルを使用することをお勧めします。必要な画像なので、収入エントリを保存します。

  • 1つのテーブル:常にタイプを設定する必要があります
  • 2つのテーブル:適切なモデルを選択するだけです

しかし、1つのテーブルのみを使用することで(!)より高速になる可能性がある1つのデータベースクエリをイメージできます。

  • 両方のタイプが必要な場合ORDERは、日付で言いましょう。

そして、1つのテーブルの方が優れているという別のポイントがありますが、それはモデルには当てはまりません

  • タイプが無限にある場合。または:タイプの数が変わる可能性がある場合。

他のすべてについては、2つの別々のテーブルの方が適しています。クエリのパフォーマンスについて:

  • テーブルが非常に大きくなり、たとえばすべての収入エントリを取得したい場合は、もちろん、600000エントリのテーブルよりも300000エントリのテーブルでそれらのエントリを検索する方が高速です。

DBMSを詳しく見ると、2つのテーブルを使用するもう1つの理由があります。

  • テーブルロック。一部のデータベースエンジンは、書き込み操作のためにテーブル全体をロックします。したがって、データの半分だけがロックされ、残りの半分は同時にアクセスできます。

ORDER2つのテーブルがあるものを見ていきます。たぶん私は間違っていて、パフォーマンスへの影響はそこにもありません。

結果:

(MySQLを使用して)3つの単純なテーブルを作成しました。

  • incid(int、PK)、money(int、nullではない)
  • expid(int、PK)、money(int、nullではない)
  • combi:( idint、PK)、type(tinyint、index、not null)、money(not null)

次に、テーブルにランダムデータを入力します。

  • money:1から10000まで
  • type:1から2
  • inc:100000エントリ
  • exp:100000エントリ
  • combi:200000エントリ

次のクエリを実行します。

SELECT id, money
FROM combi
WHERE money > 5000
ORDER BY money
LIMIT 200000;

0.1秒...インデックスなし:0.1秒

SELECT * FROM (
    SELECT id, money FROM inc WHERE money > 5000
    UNION
    SELECT id, money FROM exp WHERE money > 5000
) a
ORDER BY money LIMIT 200000;

0.16秒

SELECT id, money
FROM combi
WHERE money > 5000 && type = 1
ORDER BY money
LIMIT 200000;

0.14秒...インデックスなし:0,085秒

SELECT id, money
FROM inc
WHERE money > 5000
ORDER BY money
LIMIT 200000;

0,04秒

そして、あなたは期待される結果を見ることができます:

  • 1つのクエリで収入と支出が必要な場合は、1つのテーブルの方が高速です
  • 収入または支出のみが必要な場合は、2つのテーブルの方が高速です

しかし、私が理解していないこと:なぜクエリがtype = 1非常に遅いのですか?インデックスを使用すると、ほぼ同等の速度になると思いましたか?

于 2013-02-26T09:02:36.013 に答える