バックグラウンド
私は CS の 1 年生で、父の中小企業でアルバイトをしています。実際のアプリケーション開発の経験はありません。私は Python でスクリプトを書き、C でいくつかのコースワークを作成しましたが、このようなものはありません。
私の父は小規模なトレーニング ビジネスを経営しており、現在、すべてのクラスは外部の Web アプリケーションを介してスケジュール、録画、フォローアップされています。エクスポート/「レポート」機能がありますが、非常に一般的であり、特定のレポートが必要です。クエリを実行するために実際のデータベースにアクセスすることはできません。カスタム レポート システムのセットアップを依頼されました。
私の考えは、一般的な CSV エクスポートを作成し、(おそらく Python を使用して) オフィスで毎晩ホストされている MySQL データベースにインポートし、そこから必要な特定のクエリを実行することです。データベースの経験はありませんが、基本的なことは理解しています。データベースの作成と正規形について少し読んだことがあります。
すぐに国際的な顧客を獲得し始めるかもしれないので、それが起こった場合にデータベースが爆発しないようにしたい. また、現在、いくつかの大企業を顧客としており、さまざまな部門があります (例: ACME 親会社、ACME ヘルスケア部門、ACME ボディケア部門)。
私が思いついたスキーマは次のとおりです。
- クライアントの観点から:
- クライアントがメインテーブル
- クライアントは、所属する部門にリンクされています
- 部門は、ロンドンの人事部、スウォンジーのマーケティングなど、国中に分散している可能性があります。
- 部門は会社の部門にリンクされています
- 部門は親会社にリンクされています
- クラスの観点から:
- セッションはメインテーブルです
- 教師は各セッションにリンクされています
- 各セッションには statusid が与えられます。例: 0 - 完了、1 - キャンセル
- セッションは、任意のサイズの「パック」にグループ化されます
- 各パックはクライアントに割り当てられます
- セッションはメインテーブルです
私はスキーマを 1 枚の紙に "設計" (走り書きのようなもの) し、3 番目の形式に正規化したままにしようとしました。次に、MySQL Workbench にプラグインすると、すべてきれいになりました:
(フルサイズのグラフィックはここをクリック)
(ソース: maian.org )
実行するクエリの例
- クレジットがまだ残っているクライアントのうち、非アクティブなクライアント (今後クラスが予定されていないクライアント)
- クライアント/部門/部門ごとの出席率は? (各セッションのステータス ID で測定)
- 教師は月に何回授業を受けましたか
- 出席率の低いクライアントにフラグを立てる
- 部門内の人々の出席率を含む人事部門のカスタム レポート
質問
- これはオーバーエンジニアリングですか、それとも正しい方向に向かっていますか?
- ほとんどのクエリで複数のテーブルを結合する必要があると、パフォーマンスが大幅に低下しますか?
- おそらく一般的なクエリになるため、「lastsession」列をクライアントに追加しました。これは良い考えですか、それともデータベースを厳密に正規化する必要がありますか?
御時間ありがとうございます