データベース設計 - 効率性に関する質問(および一般的な設計の品質)
-
27-09-2019 - |
質問
私が何をしているのかわからないのではないかと心配しています。
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でデュアルキーがキーになっている場合です。そうでない場合は、その最後の部分を無視してください。