Notations

資料庫設計データベースせっけいと UML 標記法ひょうきほう。ER Diagram、類別圖符號クラスずきごうと Mermaid 語法範例ごほうはんれいふくむ。

ER Diagram to Relation

ER to Relation Model
ER to Relation Model 2

Entity Relation

Entity Relation

UML Notation

Mermaid Syntax

Inheritance

符号きごう<|--

  classDiagram
    classA <|-- classB

Composition

符号きごう*--

  classDiagram
    classC *-- classD
class Engine {
    public void start() {
        System.out.println("Engine started");
    }
}

class Car {
    private Engine engine;

    public Car() {
        this.engine = new Engine();  // Composition
    }

    public void startCar() {
        engine.start();
    }
}

Aggregation

符号きごうo--

  classDiagram
    classE o-- classF
// 部分:Player
type Player struct {
    Name string
}

// 整体:Team
type Team struct {
    Players []*Player  // Aggregation: Team has references to Player
}

func main() {
    player1 := &Player{Name: "Alice"}
    player2 := &Player{Name: "Bob"}

    team := Team{Players: []*Player{player1, player2}}

    // Team が破棄されても、Player は独立して存在できる
    team = Team{}

    fmt.Println(player1.Name)  // Alice
    fmt.Println(player2.Name)  // Bob
}

Association

符号きごう-->単方向たんほうこう)、--双方向そうほうこう

  classDiagram
    classG <-- classH
  classDiagram
    classI -- classJ

Dependency

符号きごう..>

  classDiagram
    classK <.. classL
class Engine {
    public void start() {
        System.out.println("Engine started");
    }
}

class Car {
    private Engine engine;

    // Constructor Injection (Dependency)
    public Car(Engine engine) {
        this.engine = engine;
    }
}

Realization

符号きごう..|>実装じっそうインターフェース)、..点線てんせん接続せつぞく

  classDiagram
    classM <|.. classN
  classDiagram
    classO .. classP

Aggregation / Composition / Dependency

比較項目ひかくこうもくAggregation(集約しゅうやくComposition(合成ごうせいDependency(依存いぞん
結合度けつごうど弱結合じゃくけつごう部分ぶぶん全体ぜんたい分離ぶんりして存在そんざいできる強結合きょうけつごう部分ぶぶん全体ぜんたい密接みっせつ接続せつぞくされ、単独たんどくでは存在そんざいできない弱結合じゃくけつごう、クラスは依存いぞんオブジェクトを使用しようするだけで、ライフサイクルを制御せいぎょしない
依存いぞんオブジェクトの制御権せいぎょけん部分ぶぶんほかのオブジェクトと共有きょうゆうでき、全体ぜんたい部分ぶぶんのライフサイクルを完全かんぜんには制御せいぎょしない全体ぜんたい部分ぶぶんのライフサイクルを完全かんぜん制御せいぎょし、部分ぶぶん全体ぜんたい存在そんざい依存いぞんする依存いぞんオブジェクトの生成せいせい破棄はき依存いぞんするクラスが担当たんとうせず、通常つうじょう外部がいぶ管理かんりされる
ライフサイクル関連性かんれんせい部分ぶぶん全体ぜんたいのライフサイクルは独立どくりつ全体ぜんたい破棄はきされても部分ぶぶん存続そんぞくできる部分ぶぶんのライフサイクルは全体ぜんたい関連かんれん全体ぜんたい破棄はきされると部分ぶぶん破棄はきされる依存いぞんオブジェクトとクラスのライフサイクルは無関係むかんけい、クラスは必要ひつようときだけ使用しようする
関係類型かんけいるいけい全体ぜんたい部分ぶぶん関係かんけいだが、部分ぶぶんほか全体ぜんたい共有きょうゆうできる全体ぜんたい部分ぶぶん関係かんけい部分ぶぶん厳密げんみつ全体ぜんたいぞくし、共有きょうゆうできない使用関係しようかんけい、クラスは特定とくてい時点じてんでのみ依存いぞんオブジェクトを必要ひつようとし、所有関係しょゆうかんけいはない

Go 実装例

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
type Engine struct {
    power int
}

func (e *Engine) Start() {
    fmt.Println("エンジン起動,出力:", e.power)
}

type Car struct {
    Engine  // Composition
    brand string
}

func NewCar(brand string, power int) *Car {
    return &Car{
        Engine: Engine{power: power}, // Car が破棄されると Engine も破棄される
        brand:  brand,
    }
}

func (c *Car) Drive() {
    fmt.Printf("%s 車が走り始める\n", c.brand)
    c.Start()
}

func main() {
    myCar := NewCar("Toyota", 150)
    myCar.Drive()
}
type Driver struct {
    name string
}

func (d *Driver) Drive(car *Car) {
    fmt.Printf("%s が運転中 ", d.name)
    car.Drive()
}

func main() {
    myCar := NewCar("Toyota", 150)
    driver := &Driver{name: "Alice"}
    driver.Drive(myCar)
}
type Garage struct {
    cars []*Car  // Aggregation
}

func (g *Garage) AddCar(car *Car) {
    g.cars = append(g.cars, car)
}

func (g *Garage) RemoveCar(car *Car) {
    for i, c := range g.cars {
        if c == car {
            g.cars = append(g.cars[:i], g.cars[i+1:]...)
            break
        }
    }
}

func main() {
    myCar := NewCar("Toyota", 150)
    garage := &Garage{}
    garage.AddCar(myCar)
    garage.AddCar(NewCar("Honda", 120))

    fmt.Println("ガレージ内の車両数:", len(garage.cars))

    garage.RemoveCar(myCar)
    fmt.Println("一台移動後,ガレージ内の車両数:", len(garage.cars))
}

関係類型の概要

関係類型かんけいるいけい実現方式じつげんほうしきライフサイクル特徴とくちょう
CompositionCar struct に Engine struct をEngine のライフサイクルは Car と完全かんぜん結合けつごう。Car 生成時せいせいじに Engine 生成せいせい、Car 破棄時はきじに Engine 破棄はきCar は Engine の方法メソッド直接ちょくせつ使用しようできる(c.Start()
DependencyDriver の Drive()*Car 引数ひきすうDriver と Car のライフサイクルは独立どくりつ。Driver は必要時ひつようじのみ Car を使用しようDriver は Car を所有しょゆうせず、一時的いちじてき使用しようするだけ
AggregationGarage struct が []*Car slice をふくGarage と Car のライフサイクルは独立どくりつ。Car は Garage のそとにも存在そんざいできるGarage は Car を追加ついか削除さくじょできるが、Car の生成せいせい破棄はきには責任せきにんわない