バックグラウンド
私はCSの1年生で、父親の中小企業でアルバイトをしています。実世界でのアプリケーション開発の経験はありません。私はPythonでスクリプトを書き、Cでいくつかのコースワークを書いていますが、このようなものはありません。
私のお父さんは小規模なトレーニング事業を行っており、現在すべてのクラスがスケジュールされ、記録され、外部のWebアプリケーションを介してフォローアップされています。エクスポート/「レポート」機能がありますが、それは非常に一般的であり、特定のレポートが必要です。クエリを実行するために実際のデータベースにアクセスすることはできません。カスタムレポートシステムを設定するように求められました。
私の考えは、一般的なCSVエクスポートを作成し、オフィスでホストされているMySQLデータベースに(おそらくPythonで)毎晩インポートし、そこから必要な特定のクエリを実行できるようにすることです。私はデータベースの経験はありませんが、基本を理解しています。データベースの作成と通常のフォームについて少し読みました。
国際的なクライアントがすぐに始まる可能性があるので、それが発生した場合にデータベースが爆発しないようにしてください。現在、クライアントとしていくつかの大企業があり、部門が異なります(例:ACME親会社、ACMEヘルスケア部門、ACMEボディケア部門)。
私が思いついたスキーマは次のとおりです:
- クライアントの観点から:
- クライアントはメインテーブルです
- クライアントは彼らが働いている部門にリンクされています
- 部門は国中に散らばっています。ロンドンの人事、スウォンジーのマーケティングなどです。
- 部門は会社の部門にリンクされています
- 部門は親会社にリンクされています
- クラスの観点から:
- セッションはメインテーブルです
- 教師は各セッションにリンクされています
- statusidは各セッションに与えられます。例0-完了、1-キャンセル
- セッションは、任意のサイズの「パック」にグループ化されます
- 各パックはクライアントに割り当てられています
- セッションはメインテーブルです
スキーマを「落書き」のように「設計」し、3番目の形式に正規化するようにしました。私は、MySQLのワークベンチにそれを差し込むと、それはかなり私のためにすべてをした:
(フルサイズのグラフィックはこちら)
(ソース:maian.org)
実行するクエリの例
- クレジットが残っているクライアントは非アクティブです(将来的にクラスがスケジュールされていないクライアント)
- クライアント/部門/部門ごとの出席率はどのくらいですか(各セッションのステータスIDで測定)
- 教師が1か月に行った授業の数
- 出席率の低いクライアントにフラグを立てる
- 部門の出席率を示す人事部門のカスタムレポート
質問
- これは過剰設計ですか、それとも正しい方向に進んでいますか?
- ほとんどのクエリで複数のテーブルを結合する必要があるため、パフォーマンスに大きな影響がありますか?
- おそらく一般的なクエリになるので、クライアントに「lastsession」列を追加しました。これは良い考えですか、それともデータベースを厳密に正規化しておくべきですか?
御時間ありがとうございます
divisions
はという列がありますdivisionid
。冗長だと思いませんか?名前を付けるだけid
。また、以下を含むテーブル名も_has_
削除しcities_departments
ます。ユーザーが入力した値でない限り、DATETIME
列のタイプを指定する必要がありTIMESTAMP
ます。cities
とcountries
テーブルを用意することをお勧めします。テーブルを1つに制限する問題が発生する可能性がありますstatus
。を使用しINT
て、ビット単位の比較を実行することを検討してください。これにより、そこでより多くの意味を保持できます