モデルクラスの数は?テーブル数?ビュー数?

このQ&Aのポイント
  • MVCのモデルクラスについての質問です。
  • 伝票テーブルと伝票明細テーブルがあり、モデルクラスを分けるべきかどうかについての意見を聞きたいです。
  • テーブル数とモデルクラス数の関係についても教えてください。
回答を見る
  • ベストアンサー

モデルクラスの数は?テーブル数?ビュー数?

MVCのモデルクラスについて質問です。 例えば、伝票テーブルと、伝票明細テーブルがあったとき、 (伝票テーブル:伝票番号 100 取引先A  伝票明細テーブル:    伝票番号 100 商品A 100円 15個    伝票番号 100 商品B 200円 10個  のようなもの) 「モデルクラス」は 「伝票テーブル操作用」と 「伝票明細テーブル操作用」に分けるべきでしょうか? それとも分けないべきでしょうか? 私は、 SELECT用なら「伝票テーブルと伝票明細テーブルを結合した状態でモデルクラスをつくる」 INSERT、UPDATE、DELETE用なら「伝票テーブル用」と「伝票明細テーブル用」に分けているのですが、 この方法はあっているでしょうか? 大抵のテーブルが参照オンリーではなく登録系も必要であるシステムなら、 「テーブル数」=「モデルクラス数」とし、 参照をメインにするようなシステムなら 「ビューの数」=「モデルクラス数」とする認識です。

質問者が選んだベストアンサー

  • ベストアンサー
  • shockatz
  • ベストアンサー率80% (153/191)
回答No.2

その認識でほぼ合っていると思います。 ASP.NETのような統合化された処理系ならば、テーブル操作用のクラスは、DAL(データアクセスレイヤ)として、LINQ for SQLやEntity Frameworkで自動的に作成されてしまいます。 ただ、そのようなクラスをそのまま更新系のモデルとして使いますと、CRUDに必要なメタデータ(検証用属性など)が不足したり、また参照系でも付加的な表示要素を埋め込んだ方が扱いやすいので、DALを継承したクラスを「ビューモデル」として作成する事になると思います。 結合モデルについては、AutoMapper のようなマッピングモジュールを使って「フラットな」クラスに詰め替える方法や、DAL(を継承した拡張クラス)を要素にした「入れ子」クラスを使う事など、いくつかの方法があります。 いずれの場合も、.NETの特長である強力なDALを生かしつつ、ビュー中のコードをできるだけ排除するため、すっきり洗練されたビューモデルを設計することが開発のキモになると思います。 Automapper http://news.mynavi.jp/articles/2009/12/10/automapper/

TeferiMage
質問者

お礼

回答ありがとうございます! データ取得の部分については、 DAL(データアクセスレイヤ)として、 LINQ for SQLや Entity Framework が便利ということなので、 DALを継承したクラスを「ビューモデル」として作るやり方を調べてみようと思います。 AutoMapper ? マッピングモジュール?というのを使って 「フラットな」クラスに詰め替える方法や、 DAL(を継承した拡張クラス)を要素にした「入れ子」クラスを使う事など、 非常に興味深いです。 今回はJavaでの開発なのですが、 ASP.net を使う際には是非ともこのように作ってみたいと思います。

その他の回答 (1)

noname#212058
noname#212058
回答No.1

※ モデルクラスではなく、あえて『エンティティクラス』   と言い換えて回答します。(MVC の『モデル』は、そも   そもデータストア(テーブル)に依存して設計するもので   はありませんので…) 設計方法に依存するので何とも言えない部分はありますが、 『優秀な O/R マッピングツール』を使わない前提であれば、 私も質問者さんのおっしゃる通り  ・SELECT用なら「伝票テーブルと伝票明細テーブルを   結合した状態」でエンティティクラスをつくる  ・INSERT、UPDATE、DELETE用なら「伝票テーブル用」   と「伝票明細テーブル用」に分ける ように作るのが使いやすいと思っています。 また、『「伝票テーブルと伝票明細テーブルを結合した状態」 で取得したデータを、画面に表示。ユーザが画面上で編集して その内容を登録する』という機能もよくありますが、その場合 はデータ取得・表示時は「結合したエンティティ」を使い、 登録時は「テーブル毎のエンティティ」に詰めなおすように 設計します。 そうしますと、私の設計では  エンティティクラス数 =「テーブル数」+「ビューの数」 になります。もちろん、ビューの数が多くなると変更管理が 面倒なので、なるべく少なくなるように設計を工夫しますが。

TeferiMage
質問者

お礼

お返事遅れてしまいすみません! ありがとうございました!

関連するQ&A

  • Accessで親テーブルと2つの明細テーブルでできているデータのレポートを作りたい

    親テーブルと2つの明細テーブルでできているデータのレポートを作りたいのですが、レポート機能ではフォーム作成のように、詳細セクションに2つの明細テーブルのデータを表示させることはできますか? ウィザードを使って作成するとどうしても以下のようになってしまいます。 (ちなみに親テーブルと明細テーブルは伝票番号でリレーションしています) ↓↓↓↓ 伝票番号000001に対して、明細Aテーブル(2レコード)、明細Bテーブル(1レコード)あるとする。 ----------------------------------------------------------- 本来は以下のように表示したい ヘッダーセクション 伝票番号:000001  親テーブルの情報:xxxxxxx 詳細セクション  明細Aの情報 01 aaaaaaaa  明細Aの情報 02 aaaaaaaa 明細Bの情報 11 bbbbbbbb ------------------------------------------------------------ 実際は以下のように表示される ヘッダーセクション 伝票番号:000001  親テーブルの情報:xxxxxxx 詳細セクション  明細Aの情報 01 aaaaaaaa 明細Bの情報 11 bbbbbbbb  明細Aの情報 02 aaaaaaaa 明細Bの情報 11 bbbbbbbb

  • 他のテーブルの抽出条件で更新したい。

    ・売上ヘッダ  伝票NO,売上金額合計 ・売上明細  伝票NO,明細NO,商品番号,売上金額 上記のようなテーブル構成の2つのテーブルがあります。 売上ヘッダの主キーは、伝票NOで売上明細の主キーは、伝票NOと明細NOです。 ここで、商品番号1の、売上金額に500円の差額があるため、、修正をしたいと考え、売上ヘッダと売上明細にある売上額を変更したいのですが、売上ヘッダの売上金額合計を更新する方法がわかりません。 ご教授いただけないでしょうか。

  • SQL2000 ワークテーブルの作成文について

    いつもお世話になっております。 SQLを学んで3ヶ月の初心者です。 下記の内容でご理解いただけ、分かる方がいましたら教えていただけないでしょうか。 一応、自分なりに以下作成したのですが、結果が反映されなく困っています。 よろしくお願い致します。 ※質問内容※ ・条件に従い、Aテーブルから必要な項目を抜き出し、Bワークテーブルを作成する。 ・@・・・頭で宣言しています。 delete from Bワークテーブル insert into Bワークテーブル ( ID, CD, 伝票番号, 部門CD, 引当日, ユーザID, ) select Aテーブル  Cテーブル.ID,  Aテーブル.CD,  Aテーブル.伝票番号,  Aテーブル.部門CD,  Aテーブル.引当日,  Aテーブル.ユーザID, from Aテーブル INNER JOIN Cテーブル ON Cテーブル.ID = @ID where Aテーブル.CD = @CD and ((Aテーブル.伝票番号 >= @伝票番号FROM) OR (@伝票番番号FROM IS NULL)) and ((Aテーブル.伝票番号 <= @伝票番号TO) OR (@伝票番号TO IS NULL)) 以上。

  • 各伝票に対して明細を1行目だけ表示したい

    たびたびお世話になります。 仮に以下のようなテーブルを考えるとします。 ○テーブルA (伝票) 伝票番号 (PK) 顧客コード ○テーブルB (伝票明細) 伝票番号 (PK) 伝票明細 (PK) 注文コード 大盛り区分 レストランなどでお客さんが注文した注文伝票を 想像していただければ良いかと思います。 一つの伝票番号に対して、複数の伝票明細があると。 DB上は上記のように格納するとします。 ここでテーブル結合を使って、各伝票の1行目の明細を表示しながら SQL1発で抜いてきたいと思います。どういうSQLを考えたら良いでしょうか? テーブルBの表示項目が1つだけなら、 SELECT A.伝票番号, A.顧客コード, (SELECT TOP 1 注文コード FROM テーブルB B WHERE A.伝票番号 = B.伝票番号) FROM テーブルA A で良いのですが、複数項目となるとどうやったら良いのか判りません。

  • 伝票リスト中に商品名

    いつもお世話になります。 過去ログを探してみたのですが探し方が悪かったのか見つかりませんでしたので、書き込みさせていただきました。 売上伝票のリスト中に商品名(明細一行目)を入れたいので す。 テーブルとしましては、 [T_売上伝票] 伝票番号,顧客コード.... [T_売上伝票明細] 伝票番号,行番号,商品コード,商品名..... このままクエリーをかけると、 001 000001 商品A ........ 001 000002 商品B ........ 002 000002 商品B ........ となりました。 希望は、 001 000001 商品A ........ 002 000002 商品B ........ となる事です。 何かよい方法があれば教えてくださいませ。 よろしくお願い致します。

  • 2つのテーブルの結合(同一テーブルからの2回参照)

    こんにちわ。 ■テーブルA ID |名称 | -------------- 01 |ああ | 02 |いい | 03 |うう | ■テーブルB ID |場号1 |番号2 -------------- 01 |03 |01 02 |02 |03 03 |03 |02 この2つのテーブルを下記のように結合したいのです。 テーブルB.ID, テーブルB.番号1, テーブルA.名称(番号1より), テーブルB.番号21, テーブルA.名称(番号2より) つまり、 01 | 03 | うう | 01 | ああ という形で、 テーブルA.名称(番号1より)または テーブルA.名称(番号2より) だけであれば参照できるのですが同じテーブルからの2回参照ができません。。 どうかご教授ください。

  • Excelのピボットテーブルで数も考慮した値段の平均値を出したいのです

    Excelのピボットテーブルで数も考慮した値段の平均値を出したいのですが 自分自身で組んだピボットテーブルだと平均値が出せません。 商品A 50個 100円 商品B ・・個 ・・・円 商品A 20個 150円 商品A 20個 180円 商品C ・・個 ・・・円 のようなデータがあった場合、ピボットテーブルの集計の方法で平均を選ぶと 商品の数を考慮せず1行=1個でカウントしてしまうため商品Aの場合 (100円+150円+180円)÷3=143円となってしまいます。 本当は((50個×100円)+(20個×150円)+(20個×180円))÷(50+20+20)個=128円 と計算させたいのですがどのような集計方法を選べばよいのでしょうか。 よろしくお願いします。

  • 複数のテーブルか一つのテーブルか教えて!!

    いつもお世話になっています。 今回商品テーブルを作る事になったのですが、商品の分類ごとに項目数が違うのでどうしようかと思っています。 1つ目の商品には、 商品番号|商品名|値段|画像パス|在庫数|情報1|情報2| 2つ目は 商品番号|商品名|値段|画像パス|在庫数|情報1|情報2|情報3|情報4|情報5| など項目数が違うので同じテーブルに入れるとうえの商品は情報3、情報4、情報5がからになります。 商品は最低6個ほど分類されるので、もし商品ごとにテーブルを作るとなると6テーブルは最低いることになります。 私的にはテーブルを商品ごとに分けたほうがやりやすいようにおもうのですがやはり商品テーブルを1つにしてまとめたほうがいいのでしょうか? イメージ的には電化製品店などをイメージするといいかと思います。 キーボードの商品テーブル、マウスの商品テーブル、プリンタの商品テーブルのようにテーブルを分けたらいいかなと思っているんですがどうなんでしょう?

    • ベストアンサー
    • MySQL
  • ACCESS テーブル作成にアドバイスください

    初めてACCESSに取り組んでいる超初心者です。2007使用ですが、勤務先で使えるよう、2003形式で保存するつもりです。 社内での物品請求、払い出しのような業務で使おうと思っているプログラムで、最終目的は、個人別注文(請求?)伝票の印刷と物品数量の集計(フロア毎)です。注文伝票は前回分として印刷し、次回注文時に必要に応じて訂正して利用してもらうことを考えています。 次のような感じの伝票です。 3F   山田太郎     請求種別A 1) 商品A     1個    商品B     2個    商品C     1個         定型文1 2) 商品A     3個    商品D     3個         定型文2 3)・・・ ・1人の注文伝票の中に注文番号が複数(多くて20くらいまで)、注文番号1つにつき商品が複数と定型文が1つ。 ・1枚の伝票の中で、商品、定型文は重複して使用される。 ・注文番号は全体の通し番号でなく、1枚の伝票のなかで必ず1から順につくようにしたい。 ・注文番号のふりなおし(並べ替え)と商品の並び順も変更できるようにしたい。 ・直近の請求内容が分かればよいので履歴はとらず、変更をしていければよい。(あまり難しいことはできないので) 書籍にある注文関係データベースの例を参考にして、社員テーブル、商品テーブル、注文テーブル、注文詳細テーブルを作ってみたのですが、注文関連のテーブルをどのようにすればよいかよく分かりません。現在とりあえず作ってみたのが 注文テーブル:注文書番号(オート)、社員ID、請求種別 注文詳細テーブル:注文詳細番号(オート)、注文書番号、商品ID、数量、定型文ID、注文番号(並べ替え用) です。(注文書番号にリレーションシップ設定) これだと結局同じデータ(定型文など)を何度も入力しないといけない気が・・・ 長文ですみません。アドバイスよろしくおねがいします。

  • SQL SERVER INSERT文

    決まった件数単位にデータをINSERTしたい。 例)仕入明細→仕入伝票明細(行は2行まで) 仕入明細 商品CD 商品名 数量 000001 AAA   1 000002 BBB   2 000003 CCC   3 000004 DDD   1 000005 EEE    2 を仕入伝票明細へINSERTするときに2行単位に伝票ID、行をつけて INSERTしたい 仕入伝票明細へは 伝票ID 行 商品CD 商品名 数量 001  1  000001 AAA  1 001  2  000002 BBB  2 002  1  000003 CCC  3 002  2  000004 DDD  1 003  1  000005 EEE  2 伝票IDはコントロールの伝票IDに+1してセットする こんな感じのINSERT文を作りたいのですが、どなたか教えてください 宜しくお願いします

専門家に質問してみよう