Seasar Conference 2006 Spring EJB3時代のERDレッスン ~Activity Based Datamodel 2006.05.14 The Seasar Foundation 株式会社スターロジック 羽生 章洋 © The Seasar Foundation and the others 2006. all rights reserved. 1 自己紹介 • 羽生 章洋(はぶ あきひろ)と申します。 – 昭和43年生まれの今年38歳です。 – 受託電算業務の伝票打ちから始まりました。 – プログラマ~システムエンジニアを経てコンサルタントをやっ てきました。 – 様々な業種・業務に関わってきました。 – 今はスターロジックという会社の経営をやっています。 – Seasarファウンデーションの理事もやっています。 • 今日のお話にご興味を持たれた方は、お気軽にご連 絡くださいませ。 – http://www.starlogic.jp/ – [email protected] – http://d.hatena.ne.jp/habuakihiro/(はぶにっき) Seasar Conference 2006 Spring © The Seasar Foundation and the others 2006. all rights reserved. 2 とっても大事なDB設計 • DB設計とは何か? – プログラムが終了したときに消えちゃうと困るデー タをどのように保存しておくか決める作業のこと • 何故DB設計が重要なのか? – アプリケーション(場合によってはシステムも)をま たがる 「 超グローバル変数」だから! Seasar Conference 2006 Spring © The Seasar Foundation and the others 2006. all rights reserved. 3 所詮はDB設計 • 器だけあってもさ… – プログラムがなければ何もできないよ – SQLだってプログラムのひとつ • データモデル=ビジネスモデリング? – 上流? ちゃんちゃらおかしくって。 – 事業計画書にデータモデルが書いてるのなんて 見たことがない。 – ゼロから会社作るとわかる。 先に業務プロセスありき! Seasar Conference 2006 Spring © The Seasar Foundation and the others 2006. all rights reserved. 4 だけどやっぱりDB設計 • じゃあDBがなければ どうなるの? • あったとしても、 でたらめな設計だった ら? Seasar Conference 2006 Spring © The Seasar Foundation and the others 2006. all rights reserved. 5 DBって何なのさ • そもそもDBって何? データって何? – 結果の記録を一箇所に集めたもの (レコードとはよく言ったもので) – 予定データとか計画データとかあるじゃん ・・・それって、 • 「予定を立てた」結果でしょ • 「計画を立てた」結果でしょ • 記録って何? 結果って何? – 何かを行ったから結果が生じる – 結果を忘れないために記録をする Seasar Conference 2006 Spring © The Seasar Foundation and the others 2006. all rights reserved. 6 業務とシステムの関係 はぶ商店 1.注文があると・・・ 2.商品を準備して・・・ お客様 3.商品をお届けします Seasar Conference 2006 Spring © The Seasar Foundation and the others 2006. all rights reserved. 7 注文がどんどん増えてきた! はぶ商店 1.注文があると・・・ 2.注文を受け付けて・・・ 注文の内容を 忘れるとまず いのでメモし ておく お客様 これを出荷 してね♪ 3.商品を準備して・・・ 4.商品をお届けします Seasar Conference 2006 Spring © The Seasar Foundation and the others 2006. all rights reserved. 8 さらに注文が増えてきた!! はぶ商店 1.注文があると・・・ 2.注文を受け付けて・・・ 注文の内容を 忘れるとまず いのでメモし ておく これを出荷 してね♪ 3.商品を箱詰めして・・・ お客様 荷物できた よ♪ 5.商品をお届けします Seasar Conference 2006 Spring 4.運送屋に依頼して・・・ 配送依頼の 控えを保管し ておく © The Seasar Foundation and the others 2006. all rights reserved. 9 トラブル続出! はぶ商店 1.注文があると・・・ 注文したのが 届かない! ちゃんと出 荷したの? お客様 違うものが 届けられた! Seasar Conference 2006 Spring 配送っていつ 依頼したの? そもそも注文ど うなってるの? 箱詰めしたの あってるの? © The Seasar Foundation and the others 2006. all rights reserved. 10 口頭をやめよう! はぶ商店 受注記録 梱包依頼 梱包記録 お客様 出荷依頼 出荷記録 Seasar Conference 2006 Spring © The Seasar Foundation and the others 2006. all rights reserved. 11 紙が溢れて大変!⇒IT化! はぶ商店 ビジネス プロセス お客様 Seasar Conference 2006 Spring © The Seasar Foundation and the others 2006. all rights reserved. 12 改めてよく見てみると・・・ • 保存するデータには2種類ある – 行為の記録 • 受注記録 • 梱包記録 • 出荷記録 – 行為の際の参照用 • 梱包依頼:梱包作業の際に参照する • 出荷依頼:配送作業の際に参照する Seasar Conference 2006 Spring © The Seasar Foundation and the others 2006. all rights reserved. 13 さらに参照用には別のものが • 受注記録について・・・ – 誰からの注文? : 顧客情報 – 何を注文された? : 商品情報 ⇒ 俗に言う「マスタ系」というもの 顧客 情報 商品 情報 受注 記録 お客様からの注文 Seasar Conference 2006 Spring © The Seasar Foundation and the others 2006. all rights reserved. 14 プロセス間の参照 • 受注記録を梱包時に参照する 顧客 情報 商品 情報 受注という 「業務」 受注 記録 梱包がまだのもの お客様からの注文 梱包という 「業務」 実はフラグ だったり・・・ 梱包 記録 Seasar Conference 2006 Spring © The Seasar Foundation and the others 2006. all rights reserved. 15 データライフサイクル Create, Reference, Update, Drop DLCあるいはCRUDということ • 顧客情報の保守も業務のひとつ いつ記 録する の? 何を元 に記録 する の? Seasar Conference 2006 Spring 顧客 情報 誰が記 録する の? © The Seasar Foundation and the others 2006. all rights reserved. 16 モデルに溺れない! • DBは所詮システムの一部 • ユーザにとって大切なのはUI! Seasar Conference 2006 Spring © The Seasar Foundation and the others 2006. all rights reserved. 17 UIも業務フローの一部 • UIの操作にもシナリオがある • シナリオに沿った動きが必要 • 動きの「結果」がDBに入る 商品 情報 顧客 情報 受注画面 R R お客様からの注文 受注業務 C Seasar Conference 2006 Spring 受注 記録 © The Seasar Foundation and the others 2006. all rights reserved. 18 UIも業務フローの一部(2) • 業務の流れに沿って、前工程の結果を参照する こともある 受注 記録 梱包結果 登録画面 R あるタイミングで・・・ 梱包業務 U C Seasar Conference 2006 Spring 受注 記録 梱包 記録 © The Seasar Foundation and the others 2006. all rights reserved. 19 テーブルの見分け方 • 業務と対になるのが「イベント系」 – 行為の記録 • それ以外は「リソース系」(入力支援系ともいえるかも) • イベントは – 「xxする」といえる。「xx日」といえる – 受注する、受注日=OK – 顧客する、顧客日=NG 乱暴にいうと 「xx別」という風に 集計したくなるのは リソース系 • リソースは – 「xx名」といえる。 – 顧客名=OK – 受注名=NG(案件名ならわかるけどさ⇒「案件」というリソース) • 「xxする」「xx名」両方いえないと? – それは属性 – 「数量する」「数量名」=NG Seasar Conference 2006 Spring 「案件」を「受注」する、だよね。 © The Seasar Foundation and the others 2006. all rights reserved. 20 UIはアウトプットから攻める! • 業務フローの後ろから順番に攻める! – 実は業務フローそのものもゴールからさかのぼって作 成するほうが良い • 帳票から順番に攻める! Seasar Conference 2006 Spring ② 出力に必要な 項目を埋めないと駄目! ① 出力に必要な 項目がDBにないと駄目! © The Seasar Foundation and the others 2006. all rights reserved. 21 楽々ERDレッスンのポイント ・・・と、ここまでの話を踏まえて • IDの導入 • 業務の視点に基づく正規化 • イベント系エンティティ こそが重要 • イベント系とは 交差エンティティである Seasar Conference 2006 Spring © The Seasar Foundation and the others 2006. all rights reserved. 22 交差エンティティとビジネスモデル • イベント系だと・・・ 受注 受注ID 受注No 受注日 顧客ID (FK) 担当者ID (FK) 支店ID (FK) 梱包 梱包ID 梱包日時 担当者ID (FK) 受注_梱包_関連 受注梱包関連ID 受注ID (FK) 梱包ID (FK) • 交差エンティティも ID必須! – 交差エンティティを参照するものもある • 例えば、出会い系の例とか・・・ Seasar Conference 2006 Spring © The Seasar Foundation and the others 2006. all rights reserved. 23 1:Coddのリレーショナルモデル 商品コード商品名 単価 性別 A ポチ \300 ♂ B タマ \300 ♀ C ペロ \90 ♂ Table (Relation) Column (Domain) 商品コード 単価 A B C 値の重複は 存在しない! \300 \90 商品名 性別 ポチ タマ Seasar Conference 2006 Spring ペロ ♀ ♂ © The Seasar Foundation and the others 2006. all rights reserved. 24 1:Coddのリレーショナルモデル 商品コード商品名 単価 性別 A ポチ \300 ♂ B タマ \300 ♀ C ペロ \90 ♂ B タマ 商品コード 商品名 \300 A ♀ ポチ C 単価 ペロ \300 性別 敢えて言えばClass (Tuple:Domainの 組み合わせ) Seasar Conference 2006 Spring ♂ \90 Instance (Record) ♂ © The Seasar Foundation and the others 2006. all rights reserved. 25 1:Coddのリレーショナルモデル IDを主キーにするというのは・・・ B タマ Instanceに連番を 振るということ! 2 \300 A ポチ ♀ C 1 ペロ \300 3 ♂ \90 ♂ Seasar Conference 2006 Spring © The Seasar Foundation and the others 2006. all rights reserved. 26 1:Coddのリレーショナルモデル 商品コード 商品コードID 商品コード 商品コード 商品名 単価 商品レコード 商品レコードID 商品コードID (FK) 商品名ID (FK) 単価ID (FK) 性別ID (FK) 商品名 商品名ID 商品名 単価 単価ID 単価 性別 性別ID 性別 性別 1. 各Domainは集合である。 2. TableもRecordの集合である。 3. では、DomainもTableであるとすれば!? One Fact “IN” One Place Seasar Conference 2006 Spring RDBのRはRelationship(FK)の ことではない! © The Seasar Foundation and the others 2006. all rights reserved. 27 2:ChenのERモデル • Coddさんは図表現には反対だった • そこに出てきたのが、ChenのERモデル • ERモデルとは 「世の中に存在するあらゆるものは、 具象的なものであれ抽象的なものであれ、 実体と関連という2つの概念で表現可能である」 という考え方 実体 (Entity) 属性 (Attribute) Seasar Conference 2006 Spring 関連 (Relationship) 実体 (Entity) 属性 (Attribute) © The Seasar Foundation and the others 2006. all rights reserved. 28 2:ChenのERモデル • いつの間にか、関連がFKだけで表現される ようになってしまった • だから、m:mだけ特殊になってしまう。 実体 (Entity) 関連 (Relationship) 実体 (Entity) m:m 1:m 実体 実体 (Entity) (Entity) Seasar Conference 2006 Spring 実体 1:m 実体 m:1 実体 (Entity) (Entity) (Entity) © The Seasar Foundation and the others 2006. all rights reserved. 29 2:ChenのERモデル • 抜け落ちた関連とは一体何か? 顧客 販売 商品 よくある例: 「顧客」と「商品」の間には 「販売」という関係が成立する 単なる1:mには 決してしない。 つまり・・・ Seasar Conference 2006 Spring 顧客 業務システムにおいて、 単なる1:mの議論など 本来はあり得ない! 販売 商品 © The Seasar Foundation and the others 2006. all rights reserved. 30 2:ChenのERモデル • ということは、よくある売上伝票も・・・ 顧客 顧客ID 顧客名 売上 売上ID 日付 顧客ID (FK) 商品 商品ID 商品名 単価 売上明細 売上明細ID 数量 商品ID (FK) 売上ID (FK) Seasar Conference 2006 Spring 顧客 顧客ID 顧客名 顧客_売上_関連 顧客_売上_関連ID 顧客ID (FK) 売上ID (FK) 売上 売上ID 日付 売上_売上明細_関連 売上_売上明細_関連ID 売上ID (FK) 売上明細ID (FK) 顧客 顧客ID 顧客名 売上 売上ID 日付 顧客ID (FK) 商品 商品ID 商品名 単価 売上明細 売上明細ID 数量 商品ID (FK) 売上ID (FK) 商品 商品ID 商品名 単価 商品_売上明細_関連 商品_売上明細_関連ID 商品ID (FK) 売上明細ID (FK) 売上明細 売上明細ID 数量 本来はこうなるのでは? © The Seasar Foundation and the others 2006. all rights reserved. 31 3:そしてABD • 1.と2.を改めて統合してみると・・・ 顧客 顧客ID 顧客名 顧客_売上_関連 顧客_売上_関連ID 顧客ID (FK) 売上ID (FK) 売上 売上ID 日付 売上_売上明細_関連 売上_売上明細_関連ID 売上ID (FK) 売上明細ID (FK) 商品 商品ID 商品名 単価 商品_売上明細_関連 商品_売上明細_関連ID 商品ID (FK) 売上明細ID (FK) 売上明細 売上明細ID 数量 顧客 顧客ID 顧客名 売上_関連 売上_関連ID 顧客ID (FK) 商品ID (FK) 売上ID (FK) 売上明細ID (FK) 売上 売上ID 日付 売上明細 売上明細ID 数量 商品 商品ID 商品名 単価 Seasar Conference 2006 Spring FKのあり方が変わる! つまりDB設計の 難易度が変わる! © The Seasar Foundation and the others 2006. all rights reserved. 32 3:そしてABD • 業務プロセスとデータモデルの連携 商品 企画 生産 計画 資材 購買 製造 活動(Activity)の 存在を示す 売上_関連 売上_関連ID 顧客ID (FK) 商品ID (FK) 売上ID (FK) 売上明細ID (FK) 活動で発生した 事実(Fact)を 記録する Seasar Conference 2006 Spring 営業 出荷 配送 納品 顧客 顧客ID 顧客名 売上 売上ID 日付 売上明細 売上明細ID 数量 商品 商品ID 商品名 単価 売上 回収 ・・・ 顧客 顧客ID 顧客名 回収_関連 売上_関連ID 顧客ID (FK) 口座ID (FK) 入金ID (FK) 入金 入金ID 日付 金額 口座 口座ID © The Seasar Foundation and the others 2006. all rights reserved. 33 ABD的DB設計とは • 業務単位で行う – UI最重要! – 業務の洗い出しには「おしごとマジカ」を是非! • ActivityとFactを分けて考える – FactはUIに現れる • 必要なテーブルをバラバラに定義する – FKで悩まない! • 「同じタイミング」で使うものをIRE(Inter Relation Entity)に対して、FK指定する • イメージとしては、各テーブルがコンポーネントで、IRE が設定ファイル(DIをイメージする) Seasar Conference 2006 Spring © The Seasar Foundation and the others 2006. all rights reserved. 34 必ず出てくる実装問題 • 実装が不便なのでは? – SQL書き方ドリルをまずはクリアしてね – 設計と実装のどちらのほうがスキルアップが簡単か • とはいえ面倒なのは嫌 • そこでJPA Seasar Conference 2006 Spring © The Seasar Foundation and the others 2006. all rights reserved. 35 JPAとABD • • • • JPA : Java Persistence API EJB3の一番のセールスポイント 次世代のJDBC的な位置づけと捉えられる 実はABDと相性の良いJPA – @Idとか・・・ – @ManyToManyとか・・・ • ABDの一番面倒な「リレーションシップの解決」 を自動的にやってくれる • WEB+DB PRESS Vol.28を参照 Seasar Conference 2006 Spring © The Seasar Foundation and the others 2006. all rights reserved. 36 @Idアノテーション プライマリキーとなるフィールドを指定する。 generate属性において、列挙子である TABLE,SEQUENCE,IDENTITY,AUTO,NONEから指定する。 次の例はRDBMS上のシーケンスを使用する場合です。シーケンス名はSEQ_HOGEです。 @Entity @Table(name="t_hoge") public class Hoge implements Serializable { private Long id; @Id(generate=GeneratorType.SEQUENCE, generator="SEQ_HOGE") public Long getId() { return id; } public setId(Long id) { this.id = id; } ... } Seasar Conference 2006 Spring © The Seasar Foundation and the others 2006. all rights reserved. 37 @ManyToManyアノテーション テーブル間の多:多の関係を表す。 このアノテーションを使う場合は、組み合わせを管理するいわゆる交差エンティティとしてのテーブルが必要になる。 そのため登場するのはふたつのクラスだがテーブル自体は3つ必要になる。 次の例では、クラス名とテーブル名が一致しているEmployee,Taskというふたつが記載されていますが、 更にEMPLOYEE_TASKという名前のテーブルも使用しています。 @Entity public class Employee implements Serializable { ... @ManyToMany( @Entity targetEntity=Task.class, public class Task implements Serializable { cascade={CascadeType.CREATE, CascadeType.MERGE} ) ... @JoinTable( table=@Table(name="EMPLOYEE_TASK"), @ManyToMany( joinColumns={@JoinColumn(name="EMPLOYEE_ID")}, cascade={CascadeType.CREATE, CascadeType.MERGE}, inverseJoinColumns={@JoinColumn(name="TASK_ID")} mappedBy="employees" ) targetEntity=Employee.class public Collection getTasks() { return tasks; } ) public Collection getEmployees() { return employees; } ... ... } } Seasar Conference 2006 Spring © The Seasar Foundation and the others 2006. all rights reserved. 38 でもJPAってさ・・・ • 結局、JPAの不自由さに振り回されるんじゃない の? • SQLをガリガリ書きたいシチュエーションってあ るよね。 • JPAのメリットとSQLのメリットの両立を! – それが・・・ Seasar Conference 2006 Spring © The Seasar Foundation and the others 2006. all rights reserved. 39 Kuina襲来 現在 近未来 未来 KuinaDao KuinaDao S2Hibernate-JPA KuinaCore S2Dao S2JDBC S2Hibernate-JPA Seasar Conference 2006 Spring © The Seasar Foundation and the others 2006. all rights reserved. 40 Summary • ABDはDB設計の難易度を変える – 最終的には難易度は下がる – 但し、まだまだ列の横持ちテーブル設計がはびこっているよ うに、パラダイムシフトはなかなか進まないだろう • ABDはJPAとの相性がいい! – つまりインピーダンスミスマッチ問題を低減する • ゼロにはならない – アプリケーション生産性に影響を与える • となるとJPAの出来が重要 – まだまだ不自由な面はある – そこで次世代S2DaoであるKuinaですよ! Seasar Conference 2006 Spring © The Seasar Foundation and the others 2006. all rights reserved. 41 Thank you!! ありがとう ございました Seasar Conference 2006 Spring © The Seasar Foundation and the others 2006. all rights reserved. 42
© Copyright 2024 ExpyDoc