使用 PlantUML 和 VPasCode 构建酒店管理系统实体关系图(ERD)

A YouTube thumbnail-style graphic featuring the bold text "BUILD PROFESSIONAL DATABASE DIAGRAMS" in large uppercase letters, with a pointing finger icon on the right and a rendered Entity Relationship Diagram displayed in the background.

在为酒店等复杂领域设计健壮的数据库架构时,清晰地可视化关系至关重要。无论您是在映射客户档案、跟踪房间库存,还是管理账单,一个结构良好的实体关系图(ERD)都能在开发过程中节省无数小时。在本大师班中,我将带您一步步了解我如何从头开始,在“免费 PlantUML 编辑器”中使用 PlantUML 构建一个全面的酒店管理系统 ERD。免费 PlantUML 编辑器, VPasCode.

Hotel Management ERD diagram showing relationships between Customer, Room, Reservation, Payment, and Staff entities.

1. 初始化 PlantUML 环境

我首先从设置脚本的基础结构开始。在处理包含大量属性的复杂模式时,布局的可读性至关重要。我配置 PlantUML 以隐藏不必要的杂乱元素,并优化图表的布局方向:


@startuml 
title 酒店管理系统 ERD

hide circle
left to right direction
    

为什么采用这种方法?隐藏默认的属性圆圈可使实体框保持整洁和现代化。将方向设置为“从左到右方向”有助于防止宽大的 ERD 在垂直方向上变得难以管理,从而将多表关系以逻辑方式展开。

2. 定义核心实体和属性

接下来,我需要定义代表我们业务领域的核心实体。我为每个实体配置主键、唯一约束和类型化属性。让我们看看我是如何设置核心“客户”和“房型”实体的:


entity "客户" as customer {
  * customer_id : UUID <<PK>>
  --
  first_name : VARCHAR(50)
  last_name : VARCHAR(50)
  email : VARCHAR(100) <<UK>>
  phone : VARCHAR(20)
  address : TEXT
  loyalty_points : INTEGER
  total_stays : INTEGER
  date_registered : TIMESTAMP
  date_of_birth : DATE
  nationality : VARCHAR(50)
}

entity "房型" as roomtype {
  * room_type_id : UUID <<PK>>
  --
  type_name : VARCHAR(50) <<UK>>
  description : TEXT
  standard_capacity : INTEGER
  base_price : DECIMAL(10,2)
  extra_bed_charge : DECIMAL(10,2)
  has_kitchenette : BOOLEAN
  has_balcony : BOOLEAN
}
    

通过定义明确的标记,如“<<PK>>和“<<UK>>,任何审查代码的人都能在编写数据库迁移脚本之前就立即理解索引和唯一性规则。

3. 映射操作实体(房间、预订和员工)

在参考数据就位后,我继续处理酒店管理系统的事务核心:房间、预订和员工工作流程。每个实体都通过外键链接回我们的基础表:


entity "房间" as room {
  * room_id : UUID <<PK>>
  --
  room_number : VARCHAR(10) <<UK>>
  floor_number : INTEGER
  room_type_id : UUID <<FK>>
  capacity : INTEGER
  base_price : DECIMAL(10,2)
  is_available : BOOLEAN
  has_view : BOOLEAN
  square_feet : INTEGER
  last_renovated : DATE
}

entity "预订" as reservation {
  * reservation_id : UUID <<PK>>
  --
  customer_id : UUID <<FK>>
  room_id : UUID <<FK>>
  check_in_date : DATE
  check_out_date : DATE
  number_of_guests : INTEGER
  total_amount : DECIMAL(10,2)
  status : VARCHAR(20)
  special_requests : TEXT
  created_at : TIMESTAMP
  updated_at : TIMESTAMP
  confirmation_code : VARCHAR(20) <<UK>>
}
    

4. 建立财务与服务关系

为了完成整体架构,我绘制了计费记录(付款和发票)以及由酒店员工处理的其他辅助服务(如客房服务)。为了将所有内容连接起来,我使用标准的 PlantUML 符号明确定义了基数关系:


' 关系
customer ||--o{ reservation : "创建"
room ||--o{ reservation : "分配给"
reservation ||--|| payment : "拥有"
reservation ||--|| invoice : "生成"
reservation ||--o{ roomservice : "请求"
staff ||--o{ roomservice : "完成"
roomtype ||--o{ room : "分类"

@enduml
    

设计选择:使用精确的乌鸦脚符号(例如 “||--o{用于表示强制到可选的一对多关系)可确保业务逻辑规则(例如预订必须关联客户,但客户可能拥有多个或零个活跃预订)得到准确建模。

 

完整的 PlantUML 脚本

以下是我们酒店管理系统实体关系图(ERD)的完整组装源代码。您可以将此代码直接复制并粘贴到您最喜欢的免费 PlantUML 编辑器中进行编辑或渲染矢量图形:

@startuml 

title 酒店管理系统实体关系图

hide circle
left to right direction

' 定义带属性的实体
entity "客户" as customer {
  * customer_id : UUID <>
  --
  first_name : VARCHAR(50)
  last_name : VARCHAR(50)
  email : VARCHAR(100) <>
  phone : VARCHAR(20)
  address : TEXT
  loyalty_points : INTEGER
  total_stays : INTEGER
  date_registered : TIMESTAMP
  date_of_birth : DATE
  nationality : VARCHAR(50)
}

entity "房间" as room {
  * room_id : UUID <>
  --
  room_number : VARCHAR(10) <>
  floor_number : INTEGER
  room_type_id : UUID <>
  capacity : INTEGER
  base_price : DECIMAL(10,2)
  is_available : BOOLEAN
  has_view : BOOLEAN
  square_feet : INTEGER
  last_renovated : DATE
}

entity "房型" as roomtype {
  * room_type_id : UUID <>
  --
  type_name : VARCHAR(50) <>
  description : TEXT
  standard_capacity : INTEGER
  base_price : DECIMAL(10,2)
  extra_bed_charge : DECIMAL(10,2)
  has_kitchenette : BOOLEAN
  has_balcony : BOOLEAN
}

entity "预订" as reservation {
  * reservation_id : UUID <>
  --
  customer_id : UUID <>
  room_id : UUID <>
  check_in_date : DATE
  check_out_date : DATE
  number_of_guests : INTEGER
  total_amount : DECIMAL(10,2)
  status : VARCHAR(20)
  special_requests : TEXT
  created_at : TIMESTAMP
  updated_at : TIMESTAMP
  confirmation_code : VARCHAR(20) <>
}

entity "支付" as payment {
  * payment_id : UUID <>
  --
  reservation_id : UUID <>
  amount : DECIMAL(10,2)
  payment_date : TIMESTAMP
  payment_method : VARCHAR(30)
  transaction_id : VARCHAR(50) <>
  status : VARCHAR(20)
  receipt_url : TEXT
  refund_amount : DECIMAL(10,2)
}

entity "发票" as invoice {
  * invoice_id : UUID <>
  --
  reservation_id : UUID <>
  invoice_number : VARCHAR(20) <>
  issued_date : DATE
  due_date : DATE
  subtotal : DECIMAL(10,2)
  tax : DECIMAL(10,2)
  service_charge : DECIMAL(10,2)
  total_amount : DECIMAL(10,2)
  status : VARCHAR(20)
}

entity "员工" as staff {
  * staff_id : UUID <>
  --
  first_name : VARCHAR(50)
  last_name : VARCHAR(50)
  email : VARCHAR(100) <>
  phone : VARCHAR(20)
  role : VARCHAR(30)
  hire_date : DATE
  salary : DECIMAL(10,2)
  shift_schedule : VARCHAR(50)
  is_active : BOOLEAN
}

entity "客房服务" as roomservice {
  * service_id : UUID <>
  --
  reservation_id : UUID <>
  staff_id : UUID <>
  service_type : VARCHAR(50)
  description : TEXT
  request_time : TIMESTAMP
  completion_time : TIMESTAMP
  status : VARCHAR(20)
  price : DECIMAL(10,2)
}

' 关系
customer ||--o{ reservation : "创建"
room ||--o{ reservation : "分配给"
reservation ||--|| payment : "拥有"
reservation ||--|| invoice : "生成"
reservation ||--o{ roomservice : "请求"
staff ||--o{ roomservice : "完成"
roomtype ||--o{ room : "分类"

@enduml

Editing a ERD in Visual Paradigm VPasCode


使用 VPasCode 让数据库设计栩栩如生

构建复杂的数据库模型并不意味着必须与笨拙的拖放用户界面搏斗。通过采用“图表即代码”的方法,您的架构将保持版本控制、整洁且易于维护。

准备好尝试构建自己的系统架构了吗?请前往VPasCode体验实时渲染、自动格式检测以及技术文档的无缝导出功能!

滚动至顶部