Notations
資料庫設計と UML 標記法。ER Diagram、類別圖符號と Mermaid 語法範例を含む。
ER Diagram to 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 実装例
| |
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))
}関係類型の概要
| 関係類型 | 実現方式 | ライフサイクル | 特徴 |
|---|---|---|---|
| Composition | Car struct に Engine struct を埋め込む | Engine のライフサイクルは Car と完全に結合。Car 生成時に Engine 生成、Car 破棄時に Engine 破棄 | Car は Engine の方法を直接使用できる(c.Start()) |
| Dependency | Driver の Drive() が *Car 引数を受け取る | Driver と Car のライフサイクルは独立。Driver は必要時のみ Car を使用 | Driver は Car を所有せず、一時的に使用するだけ |
| Aggregation | Garage struct が []*Car slice を含む | Garage と Car のライフサイクルは独立。Car は Garage の外にも存在できる | Garage は Car を追加・削除できるが、Car の生成・破棄には責任を負わない |