データベース設計 - 効率性に関する質問(および一般的な設計の品質)

StackOverflow https://stackoverflow.com/questions/3852622

質問

私が何をしているのかわからないのではないかと心配しています。

1:

私は呼ばれるテーブルを持っています ticket 呼ばれる列があります total. 。合計が更新されたら、それの記録(古い合計など)を保持したいので、削除することにしました total 列と呼ばれるテーブルを作成します ticket_total 列付き ticket_id, total, 、 と datetime (もちろん最新のものは「現在の」合計です)。

また

2:

それから私は後でクライアントにチケットを並べ替えることができるようにしたいことに気付きました total, 、または、合計などを集約するという報告をプルします。そのため、代わりに戻すことにしました total オンの列 ticket, 、および変更する total 合計が更新されたときに直接列ですが、最初に作成します ticket_total 前の記録としての行 total.

関連するものを照会する必要がないので、バージョン2は非常に効率的だと思われます ticket_total あまりテーブルですが、私はあなたがそこにいるDBの達人がどう思うのだろうかと思います。私はデータベースのデザインを学んでいるだけで、私はそれが得意ではないことを恐れています。

役に立ちましたか?

解決

私はあなたが提案したオプション2に行きます。

トランザクションに(チケットの) +挿入(Ticket_Total)を(Ticket_Total)挿入していることを確認して、整合性が維持されていることを確認してください。

他のヒント

2番目の選択肢は高速ですが、合計の歴史的価値に関するレポートを作成する場合は、タイムスタンプに置き換えている値を保存する別のテーブルを使用する必要があります。このタイプのテーブルは、と呼ばれます 監査テーブル.

Re:「効率」 - プロジェクトの開始時のデータベース効率についてあまり心配しないことです。早期最適化は避けるべき一般的な間違いです。

あなたのニーズとデザインに焦点を合わせることが良いことです。後で、パフォーマンスのボトルネックがどこにあるかを確認し、それらの解決に取り組むことができます。

小さなデータベース(数万の行)の場合、「非効率的な」クエリでさえ、今日のサーバーとソフトウェアを考えると非常に速くなることがよくあります。

単純にする 実際に必要がない限り、コンビネーションキーとオーバーロードテーブルセマンティクスを避けることをお勧めします。

提案 現在のチケット情報と、古い「合計」値の履歴テーブルの2種類のデータがあります。

したがって、ver 2が望ましいでしょう。

ticket
  id
  field_a
  field_b
  total    # current_total

ticket_total  # history of ticket total field
  id
  ticket_id
  total
  create_time

また 「合計」は何かの集約のように聞こえます。私はあなたがより記述的なフィールド名を思いつくことを試みることをお勧めします。 - フィールドは合計ですか? 「Total_worktime」?

追加した テーブルのインデックスを追加することを忘れないでください。発見に使用するものすべてによるインデックス。たとえば、チケットテーブルにはcustomer_idがありますか?インデックスが付けられていることを確認してください。

Ticket_totalをテーブルではなくビューにします。チケットを最新の日付までにフィルタリングする別のビューTicket_currentを作成します。つまり、チケットテーブルがticket_idとdatetimeでデュアルキーがキーになっている場合です。そうでない場合は、その最後の部分を無視してください。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top