资产管理模型设计
CMDB 表结构总结
package cmdb
import (
"gorm.io/gorm"
"time"
)
// 自定义表名
const (
AssetModelTableName = "asset_models"
AssetModelCategoryTableName = "asset_model_categories"
AssetModelAttributeTableName = "asset_model_attributes"
AssetTableName = "assets_data"
AssetRelationTableName = "asset_relations"
AssetChangeHistoryTableName = "asset_change_history"
)
// DataType 数据类型
type DataType string
const (
DefaultDataType DataType = "string"
)
// RelationType 关系类型
type RelationType string
const (
DefaultRelationType RelationType = "OneToOne"
)
// BaseModel 基本表字段
type BaseModel struct {
ID uint `gorm:"column:id;primaryKey;autoIncrement:true;comment:主键" json:"id"` // 软删除标记
CreatedAt time.Time `gorm:"column:created_at;not null;autoCreateTime;default:CURRENT_TIMESTAMP(3);comment:创建时间" json:"created_at"` // 创建时间
UpdatedAt time.Time `gorm:"column:updated_at;not null;autoUpdateTime;default:CURRENT_TIMESTAMP(3);comment:更新时间" json:"updated_at"` // 更新时间
DeletedAt gorm.DeletedAt `gorm:"column:deleted_at;index;comment:软删除时间" json:"-" swaggertype:"primitive,string"` // 软删除时间
Description string `gorm:"type:varchar(256); column:description;comment: 备注信息" json:"description"` // 备注信息
}1. asset_model_categories (模型分类表)
描述信息:存储资产模型的分类信息,支持多级分类结构
字段:
id: 主键IDparent_id: 父分类ID,用于构建树形结构name: 分类名称code: 分类编码(唯一)description: 分类描述icon: 分类图标URLsort: 排序权重created_at: 创建时间updated_at: 更新时间deleted_at: 软删除时间
CREATE TABLE `asset_model_categories` (
`id` bigint(20) unsigned NOT NULL AUTO_INCREMENT,
`created_at` datetime(3) DEFAULT NULL,
`updated_at` datetime(3) DEFAULT NULL,
`deleted_at` datetime(3) DEFAULT NULL,
`parent_id` bigint(20) unsigned DEFAULT NULL COMMENT '父分类ID',
`name` varchar(100) NOT NULL COMMENT '分类名称',
`code` varchar(50) NOT NULL COMMENT '分类编码',
`description` text COMMENT '分类描述',
`icon` varchar(255) DEFAULT NULL COMMENT '分类图标',
`sort` bigint(20) DEFAULT '0' COMMENT '排序',
PRIMARY KEY (`id`),
UNIQUE KEY `idx_asset_model_categories_code` (`code`),
KEY `idx_asset_model_categories_deleted_at` (`deleted_at`),
KEY `idx_asset_model_categories_parent_id` (`parent_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci;// AssetModelCategory 模型类别
type AssetModelCategory struct {
gorm.Model
ParentID *uint `gorm:"type:bigint;index;comment:父分类ID" json:"parent_id" form:"parent_id" query:"parent_id"`
Name string `gorm:"type:varchar(100);not null;comment:分类名称" json:"name" form:"name" query:"name"`
Code string `gorm:"type:varchar(50);uniqueIndex;not null;comment:分类编码" json:"code" form:"code" query:"code"`
Description string `gorm:"type:text;comment:分类描述" json:"description" form:"description" query:"description"`
Icon string `gorm:"type:varchar(255);comment:分类图标" json:"icon" form:"icon" query:"icon"`
Sort int `gorm:"type:int;default:0;comment:排序" json:"sort" form:"sort" query:"sort"`
Parent *AssetModelCategory `gorm:"foreignKey:ParentID;references:ID;comment:父分类" json:"parent" form:"parent" query:"parent"`
Children []AssetModelCategory `gorm:"foreignKey:ParentID;references:ID;comment:子分类列表" json:"children" form:"children" query:"children"`
Models []AssetModel `gorm:"foreignKey:CategoryID;references:ID;comment:关联模型列表" json:"models" form:"models" query:"models"`
}
func (*AssetModelCategory) TableName() string {
return AssetModelCategoryTableName
}2. asset_models (资产模型表)
描述信息:定义资产的数据模型结构
字段:
id: 主键IDname: 模型展示名称code: 模型编码(唯一)icon: 模型图标URLcategory_id: 所属分类IDdescription: 模型描述created_at: 创建时间updated_at: 更新时间deleted_at: 软删除时间
CREATE TABLE `asset_models` (
`id` bigint(20) unsigned NOT NULL AUTO_INCREMENT COMMENT '主键',
`created_at` datetime(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3) COMMENT '创建时间',
`updated_at` datetime(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3) COMMENT '更新时间',
`deleted_at` datetime(3) DEFAULT NULL COMMENT '软删除时间',
`description` varchar(256) DEFAULT NULL COMMENT ' 备注信息',
`name` varchar(128) NOT NULL COMMENT '模型展示名称',
`code` varchar(64) NOT NULL COMMENT '模型编码',
`icon` varchar(256) DEFAULT NULL COMMENT '模型图标',
`enabled` tinyint(1) DEFAULT '1' COMMENT '是否启用',
`category_id` bigint(20) unsigned DEFAULT NULL COMMENT '所属分类ID',
PRIMARY KEY (`id`),
UNIQUE KEY `idx_asset_models_code` (`code`),
KEY `idx_asset_models_deleted_at` (`deleted_at`),
KEY `idx_asset_models_category_id` (`category_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci;// AssetModel 资产模型
type AssetModel struct {
BaseModel
Name string `gorm:"type:varchar(128);not null;comment:模型展示名称" json:"name" form:"name" query:"name"`
Code string `gorm:"type:varchar(64);uniqueIndex;not null;comment:模型编码" json:"code" form:"code" query:"code"`
Icon string `gorm:"type:varchar(256);comment:模型图标" json:"icon" form:"icon" query:"icon"`
Enabled bool `gorm:"default:true;comment:是否启用" json:"enabled" json:"enabled" form:"enabled" query:"enabled"`
CategoryID *uint `gorm:"type:bigint;index;comment:所属分类ID" json:"category_id" form:"category_id" query:"category_id"`
Category *AssetModelCategory `gorm:"foreignKey:CategoryID;references:ID;comment:所属分类" json:"category" form:"category" query:"category"`
Attributes []AssetModelAttribute `gorm:"foreignKey:ModelID;references:ID;comment:模型属性列表" json:"attributes" form:"attributes" query:"attributes"`
}
func (*AssetModel) TableName() string {
return AssetModelTableName
}3. asset_model_attributes (模型属性表)
描述信息:定义资产模型的属性字段
字段:
id: 主键IDmodel_id: 关联模型IDname: 属性名称code: 属性编码(模型内唯一)data_type: 数据类型(string/number/boolean/date/datetime)is_required: 是否必填default_value: 默认值description: 属性描述created_at: 创建时间updated_at: 更新时间deleted_at: 软删除时间
CREATE TABLE `asset_model_attributes` (
`id` bigint(20) unsigned NOT NULL AUTO_INCREMENT COMMENT '主键',
`created_at` datetime(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3) COMMENT '创建时间',
`updated_at` datetime(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3) COMMENT '更新时间',
`deleted_at` datetime(3) DEFAULT NULL COMMENT '软删除时间',
`description` varchar(256) DEFAULT NULL COMMENT ' 备注信息',
`model_id` bigint(20) unsigned NOT NULL COMMENT '关联模型ID',
`name` varchar(128) NOT NULL COMMENT '属性名称',
`code` varchar(64) NOT NULL COMMENT '属性编码',
`data_type` varchar(32) NOT NULL COMMENT '数据类型',
`is_required` tinyint(1) DEFAULT '0' COMMENT '是否必填',
`default_value` varchar(256) DEFAULT NULL COMMENT '默认值',
PRIMARY KEY (`id`),
UNIQUE KEY `model_code` (`code`),
KEY `idx_asset_model_attributes_deleted_at` (`deleted_at`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci;// AssetModelAttribute 模型属性
type AssetModelAttribute struct {
BaseModel
ModelID uint `gorm:"type:bigint;not null;comment:关联模型ID" json:"model_id" form:"model_id" query:"model_id"`
Name string `gorm:"type:varchar(128);not null;comment:属性名称" json:"name" form:"name" query:"name"`
Code string `gorm:"type:varchar(64);uniqueIndex:model_code;not null;comment:属性编码" json:"code" form:"code" query:"code"`
DataType DataType `gorm:"type:varchar(32);not null;comment:数据类型" json:"data_type" form:"data_type" query:"data_type"` // (string/number/boolean/date/datetime)
IsRequired bool `gorm:"type:boolean;default:false;comment:是否必填" json:"is_required" form:"is_required" query:"is_required"`
DefaultValue string `gorm:"type:varchar(256);comment:默认值" json:"default_value" form:"default_value" query:"default_value"`
}
func (*AssetModelAttribute) TableName() string {
return AssetModelAttributeTableName
}4. assets_data (资产数据表)
描述信息:存储具体的资产实例数据
字段:
id: 主键IDmodel_id: 关联模型IDasset_code: 资产编码(唯一)asset_data: 资产数据(JSON格式)status: 资产状态(active/inactive/retired)owner: 资产负责人department: 所属部门location: 物理位置expire_date: 有效期purchase_date: 采购日期created_by: 创建人updated_by: 更新人created_at: 创建时间updated_at: 更新时间deleted_at: 软删除时间
CREATE TABLE `assets_data` (
`id` bigint(20) unsigned NOT NULL AUTO_INCREMENT COMMENT '主键',
`created_at` datetime(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3) COMMENT '创建时间',
`updated_at` datetime(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3) COMMENT '更新时间',
`deleted_at` datetime(3) DEFAULT NULL COMMENT '软删除时间',
`description` varchar(256) DEFAULT NULL COMMENT ' 备注信息',
`model_id` bigint(20) unsigned NOT NULL COMMENT '关联模型ID',
`asset_code` varchar(100) NOT NULL COMMENT '资产编码',
`asset_data` json NOT NULL COMMENT '资产数据(JSON格式)',
`status` varchar(20) DEFAULT 'active' COMMENT '状态(active/inactive/retired)',
`location` varchar(128) DEFAULT NULL COMMENT '资产位置',
`expire_date` datetime DEFAULT NULL COMMENT '有效期',
`tags` json DEFAULT NULL COMMENT '资产标签(JSON数组)',
PRIMARY KEY (`id`),
UNIQUE KEY `idx_assets_data_asset_code` (`asset_code`),
KEY `idx_assets_data_deleted_at` (`deleted_at`),
KEY `idx_assets_data_model_id` (`model_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci;// Asset 资产实例
type Asset struct {
BaseModel
ModelID uint `gorm:"type:bigint;not null;index;comment:关联模型ID" json:"model_id" form:"model_id" query:"model_id"`
AssetCode string `gorm:"type:varchar(100);uniqueIndex;not null;comment:资产编码" json:"asset_code" form:"asset_code" query:"asset_code"`
AssetData datatypes.JSON `gorm:"type:json;not null;comment:资产数据(JSON格式)" json:"asset_data" form:"asset_data" query:"asset_data"`
Status string `gorm:"type:varchar(20);default:'active';comment:状态(active/inactive/retired)" json:"status" form:"status" query:"status"`
Location string `gorm:"type:varchar(128);comment:资产位置" json:"location" form:"location" query:"location"`
ExpireDate time.Time `gorm:"type:datetime;comment:有效期" json:"expire_date" form:"expire_date" query:"expire_date"`
Tags datatypes.JSON `gorm:"type:json;comment:资产标签(JSON数组)" json:"tags" form:"tags" query:"tags"`
Model AssetModel `gorm:"foreignKey:ModelID;references:ID;comment:关联模型" json:"model" form:"model" query:"model"`
Relations []AssetRelation `gorm:"foreignKey:SourceAssetID;comment:关联关系列表" json:"relations" form:"relations" query:"relations"`
}
func (*Asset) TableName() string {
return AssetTableName
}5. asset_relations (资产关系表)
描述信息:记录资产之间的关联关系
字段:
id: 主键IDsource_asset_id: 源资产IDtarget_asset_id: 目标资产IDrelation_type: 关系类型relation_data: 关系附加数据(JSON格式)created_at: 创建时间updated_at: 更新时间deleted_at: 软删除时间
CREATE TABLE `asset_relations` (
`id` bigint(20) unsigned NOT NULL AUTO_INCREMENT COMMENT '主键',
`created_at` datetime(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3) COMMENT '创建时间',
`updated_at` datetime(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3) COMMENT '更新时间',
`deleted_at` datetime(3) DEFAULT NULL COMMENT '软删除时间',
`description` varchar(256) DEFAULT NULL COMMENT ' 备注信息',
`source_asset_id` bigint(20) unsigned NOT NULL COMMENT '源资产ID',
`target_asset_id` bigint(20) unsigned NOT NULL COMMENT '目标资产ID',
`relation_type` varchar(64) NOT NULL COMMENT '关系类型',
`relation_data` json DEFAULT NULL COMMENT '关系附加数据(JSON格式)',
PRIMARY KEY (`id`),
KEY `idx_asset_relations_deleted_at` (`deleted_at`),
KEY `idx_asset_relations_source_asset_id` (`source_asset_id`),
KEY `idx_asset_relations_target_asset_id` (`target_asset_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci;// AssetRelation 资产关系
type AssetRelation struct {
BaseModel
SourceAssetID uint `gorm:"type:bigint;not null;index;comment:源资产ID" json:"source_asset_id" form:"source_asset_id" query:"source_asset_id"`
TargetAssetID uint `gorm:"type:bigint;not null;index;comment:目标资产ID" json:"target_asset_id" form:"target_asset_id" query:"target_asset_id"`
RelationType RelationType `gorm:"type:varchar(64);not null;comment:关系类型" json:"relation_type" form:"relation_type" query:"relation_type"`
RelationData datatypes.JSON `gorm:"type:json;comment:关系附加数据(JSON格式)" json:"relation_data" form:"relation_data" query:"relation_data"`
SourceAsset Asset `gorm:"foreignKey:SourceAssetID;references:ID;comment:源资产" json:"source_asset" form:"source_asset" query:"source_asset"`
TargetAsset Asset `gorm:"foreignKey:TargetAssetID;references:ID;comment:目标资产" json:"target_asset" form:"target_asset" query:"target_asset"`
}
func (*AssetRelation) TableName() string {
return AssetRelationTableName
}6. asset_change_history (资产变更历史表)
描述信息:记录资产的所有变更历史
字段:
id: 主键IDasset_id: 关联资产IDoperation_type: 操作类型(create/update/delete/status_change)changed_by: 操作人change_reason: 变更原因before_data: 变更前数据(JSON格式)after_data: 变更后数据(JSON格式)changed_fields: 变更的字段列表(JSON数组格式)operation_time: 操作时间change_type: 变更类型(属性变更/状态变更/关系变更)change_scope: 变更范围(全部/部分)created_at: 创建时间updated_at: 更新时间deleted_at: 软删除时间
CREATE TABLE `asset_change_history` (
`id` bigint(20) unsigned NOT NULL AUTO_INCREMENT COMMENT '主键',
`created_at` datetime(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3) COMMENT '创建时间',
`updated_at` datetime(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3) COMMENT '更新时间',
`deleted_at` datetime(3) DEFAULT NULL COMMENT '软删除时间',
`description` varchar(256) DEFAULT NULL COMMENT ' 备注信息',
`asset_id` bigint(20) unsigned NOT NULL COMMENT '关联资产ID',
`operation_type` varchar(20) NOT NULL COMMENT '操作类型(create/update/delete/status_change)',
`changed_by` varchar(100) NOT NULL COMMENT '操作人',
`change_reason` varchar(255) DEFAULT NULL COMMENT '变更原因',
`before_data` json DEFAULT NULL COMMENT '变更前数据(JSON格式)',
`after_data` json DEFAULT NULL COMMENT '变更后数据(JSON格式)',
`changed_fields` json DEFAULT NULL COMMENT '变更的字段列表(JSON数组格式)',
`operation_time` datetime NOT NULL COMMENT '操作时间',
PRIMARY KEY (`id`),
KEY `idx_asset_change_history_deleted_at` (`deleted_at`),
KEY `idx_asset_change_history_asset_id` (`asset_id`),
KEY `idx_asset_change_history_operation_type` (`operation_type`),
KEY `idx_asset_change_history_operation_time` (`operation_time`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci;
// AssetChangeHistory 资产变更历史记录
type AssetChangeHistory struct {
BaseModel
AssetID uint `gorm:"type:bigint;not null;index;comment:关联资产ID" json:"asset_id" form:"asset_id" query:"asset_id"`
OperationType string `gorm:"type:varchar(20);not null;index;comment:操作类型(create/update/delete/status_change)" json:"operation_type" form:"operation_type" query:"operation_type"`
ChangedBy string `gorm:"type:varchar(100);not null;comment:操作人" json:"changed_by" form:"changed_by" query:"changed_by"`
ChangeReason string `gorm:"type:varchar(255);comment:变更原因" json:"change_reason" form:"change_reason" query:"change_reason"`
BeforeData datatypes.JSON `gorm:"type:json;comment:变更前数据(JSON格式)" json:"before_data" form:"before_data" query:"before_data"`
AfterData datatypes.JSON `gorm:"type:json;comment:变更后数据(JSON格式)" json:"after_data" form:"after_data" query:"after_data"`
ChangedFields datatypes.JSON `gorm:"type:json;comment:变更的字段列表(JSON数组格式)" json:"changed_fields" form:"changed_fields" query:"changed_fields"`
OperationTime time.Time `gorm:"type:datetime;not null;index;comment:操作时间" json:"operation_time" form:"operation_time" query:"operation_time"`
Asset Asset `gorm:"foreignKey:AssetID;references:ID;comment:关联资产" json:"asset" form:"asset" query:"asset"`
}
func (*AssetChangeHistory) TableName() string {
return AssetChangeHistoryTableName
}主要实现表的核心字段
- 分类表核心字段:
parent_id: 实现多级分类code: 唯一业务标识sort: 控制展示顺序
- 模型表核心字段:
code: 模型唯一标识category_id: 分类归属- 与属性表一对多关联
- 资产表核心字段:
model_id: 模型关联asset_code: 资产唯一标识asset_data: 存储动态属性数据(JSON)status: 生命周期状态
- 关系表核心字段:
source_asset_id/target_asset_id: 建立资产关联relation_type: 定义关系类型relation_data: 存储关系元数据
- 变更历史表核心字段:
asset_id: 关联资产before_data/after_data: 数据变更快照changed_fields: 精确记录变更点
mindmap
root((CMDB平台设计))
数据模型
资产分类
[分类表]
:::model
├─ 树形结构
├─ 编码唯一性
└─ 多级嵌套
资产模型
[模型表]
:::model
├─ 动态属性
├─ 版本控制
└─ 分类关联
资产实例
[资产表]
:::instance
├─ JSON数据存储
├─ 生命周期状态
└─ 关系图谱
接口体系
模型管理
[REST API]
:::api
├─ POST /models/versioning
├─ GET /models/:id/attributes
└─ DELETE /models/:id/attributes/:attrId
资产操作
[GraphQL]
:::api
├─ 批量查询
├─ 关系分析
└─ 状态变更
审计追踪
[WebSocket]
:::api
├─ 实时变更推送
├─ 时间线回溯
└─ 差异对比
扩展功能
集成能力
:::extension
├─ Webhook配置
├─ 数据同步任务
└─ 第三方适配器
可视化
:::extension
├─ 拓扑图谱
├─ 资源矩阵
└─ 热力图分析
最后更新于