216 lines
5.2 KiB
Markdown
216 lines
5.2 KiB
Markdown
|
|
# 软件开发文档 - 02. 数据库设计
|
|||
|
|
|
|||
|
|
本文档详细描述了DMS系统的数据库结构,包括表、字段和关系。数据库实体类将放在 `DMS.Infrastructure/Entities/` 目录下。
|
|||
|
|
|
|||
|
|
## 1. 数据库关系图 (ERD)
|
|||
|
|
|
|||
|
|
```mermaid
|
|||
|
|
erDiagram
|
|||
|
|
DEVICE {
|
|||
|
|
int Id PK
|
|||
|
|
varchar Name
|
|||
|
|
int Protocol
|
|||
|
|
varchar IpAddress
|
|||
|
|
int Port
|
|||
|
|
bool IsActive
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
VARIABLE_TABLE {
|
|||
|
|
int Id PK
|
|||
|
|
varchar Name
|
|||
|
|
varchar Description
|
|||
|
|
bool IsActive
|
|||
|
|
int DeviceId FK
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
VARIABLE {
|
|||
|
|
int Id PK
|
|||
|
|
varchar Name
|
|||
|
|
varchar Address
|
|||
|
|
int DataType
|
|||
|
|
bool IsActive
|
|||
|
|
int VariableTableId FK
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
MQTT_SERVER {
|
|||
|
|
int Id PK
|
|||
|
|
varchar ServerName
|
|||
|
|
varchar BrokerAddress
|
|||
|
|
int Port
|
|||
|
|
varchar Username
|
|||
|
|
varchar Password
|
|||
|
|
bool IsActive
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
VARIABLE_HISTORY {
|
|||
|
|
bigint Id PK
|
|||
|
|
int VariableId FK
|
|||
|
|
varchar Value
|
|||
|
|
datetime Timestamp
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
VARIABLE_MQTT_SERVER_MAP {
|
|||
|
|
int VariableId PK, FK
|
|||
|
|
int MqttServerId PK, FK
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
DEVICE ||--o{ VARIABLE_TABLE : "包含"
|
|||
|
|
VARIABLE_TABLE ||--o{ VARIABLE : "包含"
|
|||
|
|
VARIABLE ||--o{ VARIABLE_HISTORY : "记录"
|
|||
|
|
VARIABLE }o--o{ MQTT_SERVER : "关联 (多对多)"
|
|||
|
|
VARIABLE_MQTT_SERVER_MAP }|..|{ VARIABLE : ""
|
|||
|
|
VARIABLE_MQTT_SERVER_MAP }|..|{ MQTT_SERVER : ""
|
|||
|
|
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
## 2. 数据库实体类 (`Entities/`)
|
|||
|
|
|
|||
|
|
这些是与数据库表一一对应的C#类,使用了 `SqlSugar` 的特性(Attribute)来定义主键、外键等。
|
|||
|
|
|
|||
|
|
### 2.1. `DbDevice`
|
|||
|
|
|
|||
|
|
```csharp
|
|||
|
|
// 文件: DMS.Infrastructure/Entities/DbDevice.cs
|
|||
|
|
using SqlSugar;
|
|||
|
|
|
|||
|
|
namespace DMS.Infrastructure.Entities;
|
|||
|
|
|
|||
|
|
[SugarTable("Devices")]
|
|||
|
|
public class DbDevice
|
|||
|
|
{
|
|||
|
|
[SugarColumn(IsPrimaryKey = true, IsIdentity = true)]
|
|||
|
|
public int Id { get; set; }
|
|||
|
|
public string Name { get; set; }
|
|||
|
|
public int Protocol { get; set; } // 对应 ProtocolType 枚举
|
|||
|
|
public string IpAddress { get; set; }
|
|||
|
|
public int Port { get; set; }
|
|||
|
|
public bool IsActive { get; set; }
|
|||
|
|
}
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
### 2.2. `DbVariableTable`
|
|||
|
|
|
|||
|
|
```csharp
|
|||
|
|
// 文件: DMS.Infrastructure/Entities/DbVariableTable.cs
|
|||
|
|
using SqlSugar;
|
|||
|
|
|
|||
|
|
namespace DMS.Infrastructure.Entities;
|
|||
|
|
|
|||
|
|
[SugarTable("VariableTables")]
|
|||
|
|
public class DbVariableTable
|
|||
|
|
{
|
|||
|
|
[SugarColumn(IsPrimaryKey = true, IsIdentity = true)]
|
|||
|
|
public int Id { get; set; }
|
|||
|
|
public string Name { get; set; }
|
|||
|
|
public string Description { get; set; }
|
|||
|
|
public bool IsActive { get; set; }
|
|||
|
|
public int DeviceId { get; set; }
|
|||
|
|
}
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
### 2.3. `DbVariable`
|
|||
|
|
|
|||
|
|
```csharp
|
|||
|
|
// 文件: DMS.Infrastructure/Entities/DbVariable.cs
|
|||
|
|
using SqlSugar;
|
|||
|
|
|
|||
|
|
namespace DMS.Infrastructure.Entities;
|
|||
|
|
|
|||
|
|
[SugarTable("Variables")]
|
|||
|
|
public class DbVariable
|
|||
|
|
{
|
|||
|
|
[SugarColumn(IsPrimaryKey = true, IsIdentity = true)]
|
|||
|
|
public int Id { get; set; }
|
|||
|
|
public string Name { get; set; }
|
|||
|
|
public string Address { get; set; }
|
|||
|
|
public int DataType { get; set; } // 对应 SignalType 枚举
|
|||
|
|
public bool IsActive { get; set; }
|
|||
|
|
public int VariableTableId { get; set; }
|
|||
|
|
}
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
### 2.4. `DbMqttServer`
|
|||
|
|
|
|||
|
|
```csharp
|
|||
|
|
// 文件: DMS.Infrastructure/Entities/DbMqttServer.cs
|
|||
|
|
using SqlSugar;
|
|||
|
|
|
|||
|
|
namespace DMS.Infrastructure.Entities;
|
|||
|
|
|
|||
|
|
[SugarTable("MqttServers")]
|
|||
|
|
public class DbMqttServer
|
|||
|
|
{
|
|||
|
|
[SugarColumn(IsPrimaryKey = true, IsIdentity = true)]
|
|||
|
|
public int Id { get; set; }
|
|||
|
|
public string ServerName { get; set; }
|
|||
|
|
public string BrokerAddress { get; set; }
|
|||
|
|
public int Port { get; set; }
|
|||
|
|
public string Username { get; set; }
|
|||
|
|
public string Password { get; set; }
|
|||
|
|
public bool IsActive { get; set; }
|
|||
|
|
}
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
### 2.5. `DbVariableHistory`
|
|||
|
|
|
|||
|
|
```csharp
|
|||
|
|
// 文件: DMS.Infrastructure/Entities/DbVariableHistory.cs
|
|||
|
|
using SqlSugar;
|
|||
|
|
|
|||
|
|
namespace DMS.Infrastructure.Entities;
|
|||
|
|
|
|||
|
|
[SugarTable("VariableHistories")]
|
|||
|
|
public class DbVariableHistory
|
|||
|
|
{
|
|||
|
|
[SugarColumn(IsPrimaryKey = true, IsIdentity = true)]
|
|||
|
|
public long Id { get; set; }
|
|||
|
|
public int VariableId { get; set; }
|
|||
|
|
public string Value { get; set; }
|
|||
|
|
public DateTime Timestamp { get; set; }
|
|||
|
|
}
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
### 2.6. `DbVariableMqttMap` - 多对多关系映射表
|
|||
|
|
|
|||
|
|
用于连接 `Variable` 和 `MqttServer`。
|
|||
|
|
|
|||
|
|
```csharp
|
|||
|
|
// 文件: DMS.Infrastructure/Entities/DbVariableMqttMap.cs
|
|||
|
|
using SqlSugar;
|
|||
|
|
|
|||
|
|
namespace DMS.Infrastructure.Entities;
|
|||
|
|
|
|||
|
|
[SugarTable("VariableMqttMap")]
|
|||
|
|
public class DbVariableMqttMap
|
|||
|
|
{
|
|||
|
|
[SugarColumn(IsPrimaryKey = true)]
|
|||
|
|
public int VariableId { get; set; }
|
|||
|
|
|
|||
|
|
[SugarColumn(IsPrimaryKey = true)]
|
|||
|
|
public int MqttServerId { get; set; }
|
|||
|
|
}
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
## 3. 数据映射 (Mapping)
|
|||
|
|
|
|||
|
|
为了在领域模型 (`DMS.Core.Models`) 和数据库实体 (`DMS.Infrastructure.Entities`) 之间进行转换,我们将使用 `AutoMapper`。映射配置将放在 `DMS.Infrastructure/Profiles/MappingProfile.cs` 中。
|
|||
|
|
|
|||
|
|
```csharp
|
|||
|
|
// 文件: DMS.Infrastructure/Profiles/MappingProfile.cs
|
|||
|
|
using AutoMapper;
|
|||
|
|
using DMS.Core.Models;
|
|||
|
|
using DMS.Infrastructure.Entities;
|
|||
|
|
|
|||
|
|
public class MappingProfile : Profile
|
|||
|
|
{
|
|||
|
|
public MappingProfile()
|
|||
|
|
{
|
|||
|
|
CreateMap<Device, DbDevice>().ReverseMap();
|
|||
|
|
CreateMap<VariableTable, DbVariableTable>().ReverseMap();
|
|||
|
|
CreateMap<Variable, DbVariable>().ReverseMap();
|
|||
|
|
CreateMap<MqttServer, DbMqttServer>().ReverseMap();
|
|||
|
|
// 注意:对于复杂的嵌套映射,可能需要更详细的配置。
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
```
|