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