Files
DMS/软件设计文档/原始文档/02-数据库设计.md

5.2 KiB
Raw Blame History

软件开发文档 - 02. 数据库设计

本文档详细描述了DMS系统的数据库结构包括表、字段和关系。数据库实体类将放在 DMS.Infrastructure/Entities/ 目录下。

1. 数据库关系图 (ERD)

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

// 文件: 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

// 文件: 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

// 文件: 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

// 文件: 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

// 文件: 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 - 多对多关系映射表

用于连接 VariableMqttServer

// 文件: 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 中。

// 文件: 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();
        // 注意:对于复杂的嵌套映射,可能需要更详细的配置。
    }
}