DBML

在設計物流平台、供應鏈運作或履行資料庫時,閱讀原始的 DBML 資料結構宣告可能會讓您難以直觀地理解資料表、列舉、資料庫結構和參考關係之間的連結。這個DBML 資料結構視覺化工具會將您的 DBML 定義轉換為清晰且可互動的實體關係圖(ERD)。透過解析資料表結構、資料庫結構前綴、列舉類型、資料表群組以及參考關係(>, <, -, <>),資料庫管理員與軟體架構師可以一目了然地檢視複雜的追蹤系統。

DBML 視覺化的運作機制

在 VPasCode 中,DBML 渲染會解析Project 設定、列舉 宣告、資料表群組 區塊,以及資料表 定義轉換為視覺化的 ERD 節點。具有資料庫結構命名空間的資料表(例如logistics.drivers)會以完整路徑顯示,自訂列舉作為嚴格的欄位類型,外鍵參考會自動在實體之間建立視覺連結。

1. 基本設定:完整建立 FleetLogix 物流資料庫結構

為了視覺化整個物流生態系,請以有效的 DBML 語法定義專案參數、員工角色、履行實體、運送日誌與參考約束:

Project fleetlogix {
  database_type: 'PostgreSQL'
}

Enum employee_role {
  courier
  dispatcher
  manager
}

Enum status_value {
  pending
  sorting
  transit
  delivered
  exception
}

TableGroup fulfillment {
  logistics.parcels
  logistics.vehicles
  logistics.hubs
}

Table logistics.drivers {
  id int [pk, increment]
  email varchar(255) [not null, unique]
  full_name varchar(120)
  role employee_role [not null, default: 'courier']
  joined_at timestamp [not null, default: 'now()']
}

Table logistics.insurance_policies {
  id int [pk, increment]
  driver_id int [not null]
  coverage_plan varchar(20) [not null]
  expires_on date [not null]
  auto_renew boolean [not null, default: true]
}

Table logistics.parcels {
  id int [pk, increment]
  tracking_number varchar(200) [not null]
  hub_id int
  weight_kg int
  estimated_days int
  service_level varchar(10)
}

Table logistics.vehicles {
  id int [pk, increment]
  license_plate varchar(160) [not null]
  last_service date
}

Table logistics.hubs {
  id int [pk, increment]
  name varchar(80) [not null, unique]
}

Table logistics.delivery_manifests {
  id int [pk, increment]
  parcel_id int [not null]
  driver_id int [not null]
  status status_value [not null]
  checkpoint varchar(200)
  notes text

  Indexes {
    (parcel_id, driver_id) [unique]
  }
}

Table logistics.telemetry_history {
  driver_id int [not null]
  parcel_id int [not null]
  logged_at timestamp [not null, default: 'now()']

  Indexes {
    (driver_id, logged_at)
  }
}

Ref: logistics.insurance_policies.driver_id > logistics.drivers.id
Ref: logistics.delivery_manifests.parcel_id > logistics.parcels.id
Ref: logistics.delivery_manifests.driver_id > logistics.drivers.id
Ref: logistics.telemetry_history.driver_id > logistics.drivers.id
Ref: logistics.telemetry_history.parcel_id > logistics.parcels.id
Ref: logistics.hubs.id < logistics.parcels.hub_id
Ref: logistics.parcels.id <> logistics.vehicles.id
Ref: logistics.drivers.id - logistics.insurance_policies.id

Complete FleetLogix Logistics Database ERD Diagram

 

FleetLogix 中的高級結構技術

將您的 DBML 程式碼的特定部分拆解,有助於說明不同資料庫功能如何協同運作。

1. 司機管理、保險與自訂列舉

司機註冊與保護模型使用自訂列舉(employee_role),嚴格約束(unique, not null),以及兩種關係類型:標準的一對多查詢和明確的一對一連結(-).

列舉 employee_role {
  快遞員
  調度員
  管理員
}

表格 logistics.drivers {
  id int [主鍵,自動遞增]
  email varchar(255) [不可為空,唯一]
  full_name varchar(120)
  role employee_role [不可為空,預設值:'快遞員']
  joined_at timestamp [不可為空,預設值:'now()']
}

表格 logistics.insurance_policies {
  id int [主鍵,自動遞增]
  driver_id int [不可為空]
  coverage_plan varchar(20) [不可為空]
  expires_on date [不可為空]
  auto_renew boolean [不可為空,預設值:true]
}

// 一對多司機關係
Ref: logistics.insurance_policies.driver_id > logistics.drivers.id

// 一對一司機合約關係
Ref: logistics.drivers.id - logistics.insurance_policies.id

FleetLogix Drivers and Insurance ERD Layout

 

2. 履行分組與多對多關係

實體資產層包含一個TableGroup,包含logistics.parcels, logistics.vehicles,以及logistics.hubs。它使用反向關係運算子(<)來處理區域分發中心,並使用多對多關係運算子(<>)來連接包裹與配送車輛。

TableGroup 履行 {
  物流.包裹
  物流.車輛
  物流.樞紐
}

Table 物流.包裹 {
  id 整數 [主鍵, 自增]
  追蹤編號 字串(200) [不可為空]
  樞紐ID 整數
  重量_公斤 整數
  預計天數 整數
  服務等級 字串(10)
}

Table 物流.車輛 {
  id 整數 [主鍵, 自增]
  車牌號碼 字串(160) [不可為空]
  上次保養 日期
}

Table 物流.樞紐 {
  id 整數 [主鍵, 自增]
  名稱 字串(80) [不可為空, 唯一]
}

// 使用反向箭頭方向 (<) 的一對多關係
Ref: 物流.樞紐.id < 物流.包裹.hub_id

// 多對多關係 (<>)
Ref: 物流.包裹.id <> 物流.車輛.id

FleetLogix Fulfillment TableGroup ERD

 

3. 實時追蹤、複合索引與狀態枚舉

清單與遙測模組監控活躍的包裹處理。它們使用追蹤狀態枚舉(status_value),單一複合唯一索引(例如 (包裹ID, 司機ID) [唯一])來確保記錄完整性,並使用多欄位索引以實現快速的時間順序掃描。

Enum status_value {
  等待中
  分揀中
  在途
  已投遞
  異常
}

Table 物流.包裹 {
  id 整數 [主鍵, 自增]
  追蹤編號 字串(200) [不可為空]
}

Table 物流.司機 {
  id 整數 [主鍵, 自增]
  全名 字串(120) [不可為空]
}

Table 物流.投遞清單 {
  id 整數 [主鍵, 自增]
  包裹ID 整數 [不可為空]
  司機ID 整數 [不可為空]
  狀態 status_value [不可為空]
  檢查點 字串(200)
  備註 文字

  索引 {
    (包裹ID, 司機ID) [唯一]
  }
}

Table 物流.遙測歷史 {
  司機ID 整數 [不可為空]
  包裹ID 整數 [不可為空]
  記錄時間 時戳 [不可為空, 預設值: 'now()']

  索引 {
    (司機ID, 記錄時間)
  }
}

Ref: 物流.投遞清單.包裹ID > 物流.包裹.id
Ref: 物流.投遞清單.司機ID > 物流.司機.id
Ref: 物流.遙測歷史.司機ID > 物流.司機.id
Ref: 物流.遙測歷史.包裹ID > 物流.包裹.id

DBML 的戰略最佳實務

  • 使用 TableGroup 整理核心資料集合: 將密切相關的資料表(例如 物流.包裹, 物流.車輛,以及 物流.樞紐)歸類於一個 TableGroup,以保持視覺佈局的整齊。
  • 確保關係方向正確: 標準化使用 >(多對一)或 <(一對多)因此視覺上的外鍵箭頭會乾淨地從子欄位指向主鍵。
  • 使用索引與列舉值強制執行業務規則: 使用複合唯一索引(例如 (包裹ID, 司機ID) [唯一])以及自訂列舉值(例如 狀態值)以在資料結構層級直接強制執行業務約束。
返回頂端