Files
Denso/docs/MapEditor/Database_Design.md
2026-07-03 16:31:37 +07:00

3.8 KiB

Database Design / Thiết kế Database

📋 Overview / Tổng quan

MapEditor sử dụng normalized relational schema để lưu trữ map data thay vì JSON blob.

🎯 Design Philosophy / Triết lý Thiết kế

Anti-pattern (Not Used)

Maps table:
  - id
  - name
  - vdma_lif_json TEXT  <-- Store entire JSON blob

Problems với JSON blob approach:

  • Cannot query specific elements
  • No foreign key constraints
  • Poor performance for complex queries
  • Cannot index nested data

Our Approach - Normalized Relational Schema

Benefits:

  • Query any element directly
  • Foreign keys ensure data integrity
  • Efficient indexes
  • Easy to join với robot positions, orders, analytics

📊 Entity Relationship Diagram

erDiagram
    Maps ||--o{ Stations : contains
    Maps ||--o{ Edges : contains
    Maps ||--o{ Zones : contains
    Maps ||--o{ VehicleTypes : defines

    Stations ||--o{ InteractionNodes : has
    Stations ||--o{ Edges : "start from"
    Stations ||--o{ Edges : "end at"

    InteractionNodes ||--o{ Actions : contains

    Maps {
        uuid id PK
        string layoutId UK "VDMA LIF layoutId"
        string layoutName
        string layoutVersion
        int layoutLevel "Floor number"
        float referenceX "Origin X"
        float referenceY "Origin Y"
    }

    Stations {
        uuid id PK
        uuid mapId FK
        string stationId UK "VDMA LIF stationId"
        string stationType
        float positionX
        float positionY
        float positionTheta
    }

    InteractionNodes {
        uuid id PK
        uuid stationId FK
        string interactionNodeId UK
        float positionX
        float positionY
        float positionTheta
        string vehicleTypeIds "JSON array"
    }

    Actions {
        uuid id PK
        uuid interactionNodeId FK
        string actionType
        string blockingType
        string actionParameters "JSON"
    }

    Edges {
        uuid id PK
        uuid mapId FK
        string edgeId UK
        string startStationId FK
        string endStationId FK
        string trajectory "JSON NURBS"
        float maxSpeed
        boolean bidirectional
    }

    Zones {
        uuid id PK
        uuid mapId FK
        string zoneId UK
        string zoneType
        string geometry "JSON polygon"
    }

    VehicleTypes {
        uuid id PK
        uuid mapId FK
        string vehicleTypeId UK
        float vehicleLength
        float vehicleWidth
    }

🔑 Key Design Decisions

1. Dual ID System:

  • id (UUID): Database primary key
  • {entity}Id (String): VDMA LIF identifier, business key

2. Position Decomposition:

  • Store as separate columns: positionX, positionY, positionTheta
  • Enable spatial queries và indexing

3. Trajectory as JSON:

  • Store NURBS trajectory as JSON string
  • Complex structure, rarely queried independently

4. Vehicle Type IDs as JSON Array:

  • Store vehicleTypeIds as JSON array
  • Typically small arrays, loaded together with edge/node

5. Actions Hierarchy:

  • Actions belong to InteractionNodes (not Stations directly)
  • Follows VDMA LIF structure exactly

📈 Indexes for Performance

Critical Indexes:

  • Maps: layoutId (unique)
  • Stations: mapId, stationId, stationType, (positionX, positionY)
  • Edges: mapId, edgeId, startStationId, endStationId
  • InteractionNodes: stationId, interactionNodeId

Last Updated: 2025-11-13