DBML

在设计物流平台、供应链运营或履行数据库时,阅读原始的DBML模式声明可能会难以直观地看出表、枚举、模式和引用之间的连接关系。该DBML模式可视化工具可将您的DBML定义转换为清晰、交互式的实体关系图(ERD)。通过解析表结构、模式前缀、枚举类型、表组以及引用关系(>, <, -, <>),数据库管理员和软件架构师可以一目了然地检查复杂的追踪系统。

DBML可视化的工作原理

在VPasCode中,DBML渲染解析Project设置、Enum声明、TableGroup表组块以及Table表定义转换为可视化的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),严格的约束条件(唯一, 非空),以及两种关系类型:标准的一对多查找和显式的 一对一链接(-).

枚举 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 fulfillment {
  logistics.parcels
  logistics.vehicles
  logistics.hubs
}

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]
}

// 一对多关系,使用反向箭头方向 (<)
Ref: logistics.hubs.id < logistics.parcels.hub_id

// 多对多关系 (<>)
Ref: logistics.parcels.id <> logistics.vehicles.id

FleetLogix Fulfillment TableGroup ERD

 

3. 实时追踪、复合索引与状态枚举

清单和遥测模块监控正在处理的包裹。它们使用一个追踪状态枚举(status_value),单个复合唯一索引(例如 (parcel_id, driver_id) [unique])来确保记录完整性,并使用多列索引来实现快速的时间顺序扫描。

Enum status_value {
  pending
  sorting
  transit
  delivered
  exception
}

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

Table logistics.drivers {
  id int [pk, increment]
  full_name varchar(120) [not null]
}

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.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

DBML 的战略最佳实践

  • 使用 TableGroup 组织核心集合: 将紧密关联的表(例如 logistics.parcels, logistics.vehicles,以及 logistics.hubs)分组到一个 TableGroup中,以保持你的视觉布局清晰有序。
  • 确保关系方向正确: 统一使用 >(一对多)或 <(一对多)因此,可视化外键箭头会清晰地从子字段指向主键。
  • 使用索引和枚举来强制执行业务规则: 使用复合唯一索引(例如 (包裹ID, 司机ID) [唯一]) 和自定义枚举(例如 状态值) 来在模式级别直接强制执行业务约束。
滚动至顶部