Upload
jiemamy
View
533
Download
0
Tags:
Embed Size (px)
Citation preview
Class Diagrams
http://creativecommons.org/licenses/publicdomain/
RootModel
1
DataSetModel
DomainModel0..*1
EntityModel
0..*
1
ColumnCheckConstraint
0..11
NotNullConstraint
0..11
ViewModel TableModel
AttributeModel0..*
1
IndexModel
0..*
1
IndexColumnModel
1..*1
ColumnRef«enum»SortOrder
0..1 11
ColumnModel
0..1
1
DataType
1
1
0..1
1
0..110..1
1
Primarykey
TableCheckConstraint
BuiltinDataTypeDomainRef
0..*1
0..*1 RecordModel
Map<ColumnRef, String>
11
«enum»DataTypeCategory
1
1
1
0..*
UniqueKey
ForeignKey
*
1
«enum»MatchType
«enum»Referential
Action
0..1
0..1
Deferrability
0..1
«enum»InitialyCheck
Time
0..1
モデル俯瞰図
Map.Entry
TableRef
List<RecordModel>
このページで、いきなり内容を覚えられなくても、理解できなくても大丈夫です。まずは全体がどんな感じになっているのか眺めて、後からまとめとして
見直すのが良いと思います。
RootModel
DataSet
DomainModel
EntityModel
AttributeModel
IndexModel
IndexColumnModel
ConstraintModel
RecordModel
jiemamy: Jiemamyid: UUID
JiemamyElement
ほぼ全てのモデルはJiemamyElementを実装。
つまり、IDを持っている。
ただし、DataTypeとElementReferenceだけは例外。
adapters: List<Object>
Adaptable
JiemamyElementはAdaptableを実装している。(アダプタを登録可能)
アダプタは「動的にinterfaceを追加する」という要件を擬似的に(言語仕様的には無理だから)実現するための仕組み。「Extension Objectパターン」とも呼ばれる。例えば Adaptable#registerAdapter(comparableImpl); とした場合、Adaptable#getAdapter(Comparable.class); でcomparableImplが取得できる。これらの操作は、registerAdapter が implements Comparable を意味し、getAdapter は Comparable へのキャストに相当する。
いきなりちょっと慣れないパターンで難解だと思いますが、ポイントです。
JiemamyElementと
Adaptable
1
DataSet DomainModel
0..*
1
EntityModel
0..*
1
ViewModel TableModel
0..*
dialectClassName: StringbeginScript: StringendScript: Stringdescription: StringschemaName: Stringdomains: List<DomainModel>entities: SortedSet<EntityModel>dataSets: List<DataSet>
RootModel
データモデルのRootある時点のDBの状態をあらわす
とにかく多用するクラス。
RootModelまわり
テーブル
カラム等の「属性」とインデックスで構成
AttributeModel0..*1
IndexModel
0..*
1
ColumnModelTableConstraint
ビューは、文字列で定義文を持つ。
CREATE VIEW hoge AS ...以降のSELECT文が定義文。
name: StringlogicalName: StringbeginScript: StringendScirpt: Stringdescription: String
EntityModel
definition: String
ViewModel
attributes:List<AttributeModel>indexes: List<IndexModel>
TableModel
ER図の「E」の要素Entity = 実態
要は、テーブルとビュー
RootModel 0..*1
Entity, Tableまわり
ColumnModelTableConstraint
PrimaryKeyUniqueKey
KeyConstraintTableCheckConstraint
name: StringlogicalName: Stringdescription: String
AttributeModel
テーブルが持つ属性
CREATE TABLE文の () の中にカンマ区切りで書かれるもの、という概念でOKです。
つまり、カラムと各種制約
TableModel 0..*1
RootModel EntityModel0..*1
LocalKeyForeignKey
属性まわり
ColumnCheckConstraint
NotNullConstraint
0..11
DataType11
0..11
PrimaryKey
0..1
1
UniqueKey
0..11
dataType: DataTypedefaultValue: StringcheckConstraint: ColumnCheckConstraintnotNullConstraint: NotNullConstraintprimaryKey: PrimaryKeyuniqueKey: UniqueKey
ColumnModel
カラム
名前やデータ型、各種制約を持つ。
カラム定義に伴って設定できる制約
CREATE TABLE FOO ( COL1 INTEGER UNIQUE, COL2 INTEGER PRIMARY KEY, COL3 INTEGER NOT NULL, COL4 INTEGER CHECK (COL4 > 0));ちなみに、それぞれ1個ずつしか定義できない。
TableModel 0..*1
RootModel EntityModel0..*1
name: StringlogicalName: Stringdescription: String
AttributeModel
カラムまわり
DomainModelTableModel
ColumnRef
ColumnModel
DomainRefTableRef
jiemamy: JiemamyreferenceId: UUID
ElementReference<T extends JiemamyElement>
T - TableModelT - ColumnModel
T - DomainModdel
とあるJiemamyElementへの参照オブジェクト
Declaration = 宣言Reference = 参照
例えば、以下における2行目のCOL1は宣言、3行目のCOL1、及びCOL2は参照である。
CREATE TABLE FOO ( COL1 INTEGER NOT NULL, FOREIGN KEY COL1 REFERENCES BAR(COL2));
ちなみに、BARはテーブルに対するReference、FOOはDeclarationです。
DeclarationとReference
1..*
1
ColumnRef
0..1 1
1
RootModel EntityModel0..*1
TableModel 0..*1name: Stringunique: booleanindexColumns: List<IndexColumnModel>
IndexModel
columnRef: ColumnRefsortOrder: SortOrder
IndexColumnModel
ASCDESC
«enumeration»SortOrder
インデックス
インデックス名、一意indexかどうか、
カラムの組み合わせ(参照)、ソート順
を持つ。
インデックスまわり
TableModel 0..*1
RootModel EntityModel0..*1
keyColumns: List<ColumnRef>deferrability: Deferrability
KeyConstraintColumnRef 1..* 1
TableConstraint
name: StringlogicalName: Stringdescription: String
AttributeModel
このカラムが制約を受ける。
0..1
0..1
deferrable: booleaninitiallyCheckTime: InitiallyCheckTime
Deferrability
IMMEDIATEDEFERRED
«enumeration»InitialyCheck
Time
LocalKey
PrimaryKey UniqueKey
外部キーではないキー制約。
遅延評価の設定
INSERTしたら即座にキー制約違反としてエラーにするのか、COMMITするまで制約の評価を遅延させるのか、
を設定する
キー制約
ColumnRef 1..* 1
0..1
TableModel 0..*1
RootModel EntityModel0..*1
matchType: MatchTypeonDelete: ReferentialActiononUpdate: ReferentialActionreferenceColumns: List<ColumnRef>
ForeignKeyModel
keyColumns: List<ColumnRef>deferrability: Deferrability
KeyConstraint
CASCADESET_NULLSET_DEFAULTRESTRICTNO_ACTION
«enumeration»Referential
Action
0..1
SIMPLEFULLPARTIAL
«enumeration»MatchType
ColumnRef 1..* 1
TableConstraint
name: StringlogicalName: Stringdescription: String
AttributeModel
外部キー
制約名制約を受ける(キーとなる)カラム制約する(参照する)カラム
マッチ型ON DELETE/UPDATEの設定
を持つ。
ER図の「R」の要素Relation = 関連
このカラムによって(↓に続く)
このカラムが制約を受ける。
外部キー制約
ColumnCheckConstraint0..11
NotNullConstraint0..11
DataType
BuiltinDataTypeDomainRef
1
1
RootModel 0..*1
name: StringlogicalName: StringdataType: BuiltinDataTypedescription: StringcheckConstraint: ColumnCheckConstraintnotNullConstraint: NotNullConstraint
DomainModel
ドメイン(ユーザ定義型)
ドメイン名、実体の型、
設定できる制約(NNとCHECK)
を持つ。
ドメインの参照は、データ型としてふるまう事ができる。
これ、難解なのでポイントです。
ドメインまわり
アダプタ
RootModel DomainModel0..*1
EntityModel
0..*
1
TableModel AttributeModel0..*1
ColumnModel 11
DomainRef
«enumeration»DataTypeCategory
1
11
toBuiltinDataType(): BuiltinDataType
DataType
category: DataTypeCategorytypeName: String
BuiltinDataType
DataType型は、必ずいずれかのBuiltinDataTypeに還元できる。
自分がBDTならば、自分自身を返し、DomainRefならば、対応する
DomainModelが持つBDTを返す。
DB組み込み(ビルトイン)つまり元からDBが備えているデータ型。primitiveな型。
Adaptableを実装している。(DataTypeはJiemamyElementではないから)
adapters: List<Object>
Adaptable
BuiltinDataTypeに対するoptionalなモデルVARCHARのサイズなど、型に依存した付加的な情報はここに保持される。
size: Integer
SizedDataTypeAdapter
0..*
1
precision: Integerscale: Integer
PrecisionedDTAdapter
serial: Boolean
SerialDataTypeAdapter
等。自由
データ型とアダプタ
Map.Entry
Map.Entry
TableRef
0..*
1
RecordModel
RootModel
0..*
1
name: Stringrecords: Map<TableRef, RecordModel>
DataSetModel
ColumnRef
String
List<RecordModel>
データセット
INSERT文用のデータモデル。RootModelは複数のデータセットを
保持することができる。
0..*1
0..*1
データセット
ColumnCheckConstraint
NotNullConstraint
TableConstraint
PrimaryKey UniqueKey
ConstraintModel
KeyConstraint
ColumnConstraint
ValueConstraint
CheckConstraintForeignKey LocalKey
TableCheckConstraint
制約この型を頂点に、結構カオスなのでポイントです。
テーブルにsetできる制約 カラムにsetできる制約
値の制約他のテーブル/カラムのデータに影響されない系。
各種キー制約他のテーブル/カラムのデータに影響される系。
制約モデルクラス俯瞰図
adapters: List<Object>
RootModelrootModel: RootModelpresentations: List<DiagramPresentationModel>
DiagramPresentations11
1 1
name: StringnodeProfiles: Map<NodeAdapter, NodeProfile>connectionProfiles: Map<ConnectionAdapter, ConnectionProfile>mode: Modelevel: Level
DiagramPresentationModel0..*
1
Map.Entry Map.Entry
entityModel: EntityModel
NodeAdapter
color: JmColorboundary: JmRectangle
NodeProfile
0..*1
0..*1
coreForeignKey: ForeignKey
ConnectionAdapter
color: JmColorbendpoints: List<JmPoint>
ConnectionProfile
PHYSICALLOGICAL
«enumeration»Mode
ENTITYKEYATTRATTRTYPE
«enumeration»Level
adapters: List<Object>
EntityModel
Adapter
adapters: List<Object>
ForeignKey11
Adapter
11
Adapter
1 1 11
red: intgreen: intblue: int
JmColor
x: inty: intwidth: intheight: int
JmRectangle
x: inty: int
JmPoint
1枚のER図をあらわす
複数のER図をあらわす。
RootModelのアダプタとして保持される。
ERにおける実体ではなく、ダイアグラムにおけるノードをあらわす。
モノは一緒なんだが、概念的意味的・責務的に微妙に違う。
EntityModelのアダプタとして保持される。
ERにおける関連ではなく、ダイアグラムにおける
コネクションをあらわす。
モノは一緒なんだが、概念的意味的・責務的に微妙に違う
ForeignKeyのアダプタとして保持される。
Jiemamy viewまわり
Map.Entry
Jiemamy JiemamyImplementation11
InstanceProvider<Dialect>
1
1
ReferenceResolver11
EventBroker1
1
Map<Jiemamy, JiemamyFactory>
11
JiemamyFactory
0..*1
0..*
1
Map<UUID, JiemamyElement>11
CommandListener
0..*
1
1
1
1
1
RootModel1
1
DispatchStrategy
Dialectのインスタンスを引き当てる
Jiemamyの実装をあらわす
モデルIDから実体を引き当てる
モデルに変化があった時にリスナーに通知する
コンテキストオブジェクト
モデル、その他のインスタンスを生成する
JiemamySerializer
JiemamyFacade
«create»
«create»
«create»
JiemamyElement Element
Reference<T>
«create»
DataType
«create»
adapter:Object
«create»
ロジッククラス俯瞰図
通知を受けるクラス
どんな条件の時(どの値が変わった時等)通知を受けたいのか?判断する戦略クラス。
ArtemisExtender
0..*1
JiemamyImplementationを拡張するオブジェクト(ArtemisView が代表例)このExtenderによって、JiemamyFactoryの機能がenhanceする(増える/変化する)。通常はDiagramPresentationModelの生成できないが、Extenderによって生成できるようになる。また、拡張なしではRootModelはDiagramPresentationsをアダプタとして持っていないが、拡張することにより生成時に自動的にアダプタ追加が行われる。EntityModelに対するNodeAdapterやForeignKeyModelに対するConnectionAdapterも同様。このページでこのExtenderだけは仕様外。
adapters: List<Object>
Adaptable0..* 1
JiemamyFactory
«create»
Class<T extends JiemamyElement>
«reference»
JiemamyElement
JiemamyFactoryがJiemamyElementを作る時は、Classを参照して、その指定されたクラスのインスタンスを生成する。
JiemamyElement生成時、FactoryExtension + ArtemisExtenderの
ロジックに従って、生成する実装クラスを選び、さらに自動的に必要なアダプタのみを登録する。
JiemamyElement生成ロジック
アダプタ
NodeAdapter
DiagramPresesntations
ConnectionAdapter
FactoryExtension«use»
«enumeration»DataTypeCategory
adapters: List<Object>category: DataTypeCategorytypeName: String
BuiltinDataType
0..* 1
アダプタ
size: Integer
SizedDataTypeAdapter
precision: Integerscale: Integer
PrecisionedDTAdapter
serial: Boolean
SerialDTAdapter
1
JiemamyFactory
«create»
DataTypeMold<T extends DataType>
T - BuiltinDataType
category: DataTypeCategoryname: Stringaliases: String[]supportedAdapterClasses: Class<?>[]
BuiltinDataTypeMold DomainModel
T - DomainRef
«reference»
DataType
DomainRef
JiemamyFactoryがDataTypeを作る時は、
DataTypeMoldを参照して、DataType型のインスタンスを生成する。
MoldがDomainModelであればDomainRefを、BuiltinDataTypeMoldであればBuiltinDataTypeを
生成する。
BuiltinDataType生成時、BuiltinDataTypeMold#supportedAdapterClasses
に従って、自動的にアダプタを登録する。データ型生成ロジック
Dialect
DataTypeResolver
ConnectionAdvisor
SqlEmitter
MoldManager
EntityImportVisitor
ForeignKeyImportVisitor
1
1
1
11
1
1
1
1
1
1
1
SQL方言
RDBMSごとの差異を吸収する戦略クラス
1. DatabaseMetadataから読み込んだ データをBuiltinDataTypeに解決2. DataTypeをSQL用の型文字列に解決
BuiltinDataTypeMold1..*1
BuiltinDataTypeからBuiltinDataTypeMoldの解決
RootModelからSqlStatementのリストを生成
DatabaseMetadataからRootModelに情報を読み込む
仕様内
仕様外
Dialectまわり
現在、あまり気にしなくてよいw
SqlEmitter 仕様外
SQL生成まわり
TokenResolver11
0..*1
IdentifierKeyword Literal OperatorSeparator
SQL文 単語
予約語識別子(カラム名テーブル名など)
リテラル 括弧等 演算子
ReferentialAction,MatchType, SortOrder
InitialyCheckTime等をToken列に変換する
仕様内
RootModel
«create»«reference»
List<SqlStatement>
0..*
1
toString(): String
Token
toString(): String
tokens: List<Token>
SqlStatement
SqlFormatter «use»