.NET中实现一库多租户(Single Database Multi-Tenancy)模式,主要通过共享数据库但隔离数据的方式实现。

实现一库多租户模式的方案

:在.NET中实现一库多租户(Single Database Multi-Tenancy)模式,主要通过共享数据库但隔离数据的方式实现。以下是几种常见实现方法:


具体实现可参考NetCoreKevin的Kevin.EntityFrameworkCore模块

基于NET8构建的现代化Saas企业级WebAPI架构,采用前后端分离设计:

  • 前端:Vue3框架 - 认证授权:IDS4单点登录系统
  • 架构特性:
    • DDD领域驱动设计
    • 多级缓存机制
    • 分布式系统支持
    • 一库多租户实现
  • 核心技术集成:
    • CAP事件总线
    • SignalR实时通信
    • IOC模块化依赖注入
  • 任务调度:
    • Quartz自动任务
    • 多短信平台集成
  • AI智能体:
    • AgentFramework
    • SemanticKernel
  • 其他功能:
    • API多版本管理
    • 单元测试框架
    • RabbitMQ消息队列

项目地址:github:https://github.com/junkai-li/NetCoreKevin

Gitee: https://gitee.com/netkevin-li/NetCoreKevin

共享表+租户ID列

在每张表中添加TenantID列,查询时自动过滤租户数据。

csharp 复制代码
// 实体基类
public abstract class TenantEntity
{
    public int TenantId { get; set; }
}

// 查询过滤
var tenantProducts = dbContext.Products.Where(p => p.TenantId == currentTenantId);

EF Core可通过全局查询过滤器自动实现:

csharp 复制代码
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
    modelBuilder.Entity<Product>().HasQueryFilter(p => p.TenantId == _tenantProvider.GetTenantId());
}

动态Schema

每个租户使用独立的数据库Schema,表结构相同但数据隔离。

csharp 复制代码
// 动态设置Schema
modelBuilder.HasDefaultSchema(tenantSchema);

// 或针对特定实体
modelBuilder.Entity<Product>().ToTable("Products", tenantSchema);

SQL Server创建Schema示例:

sql 复制代码
CREATE SCHEMA tenant1;
CREATE TABLE tenant1.Products (...);

行级安全(RLS)

使用数据库原生行级安全策略(SQL Server/PostgreSQL支持)。

SQL Server示例:

sql 复制代码
CREATE SECURITY POLICY TenantFilter
ADD FILTER PREDICATE dbo.fn_tenantPredicate(TenantId) ON dbo.Products;

应用代码只需正常查询,数据库自动过滤。


实现要点

租户识别

  • 通过子域名识别:tenant1.example.com
  • JWT声明或Cookie
  • 请求头参数

依赖注入

csharp 复制代码
services.AddScoped<ITenantProvider>(sp => 
    new HttpContextTenantProvider(sp.GetService<IHttpContextAccessor>()));

数据库上下文

csharp 复制代码
public class TenantDbContext : DbContext
{
    private readonly ITenantProvider _tenantProvider;

    public TenantDbContext(ITenantProvider tenantProvider) 
    {
        _tenantProvider = tenantProvider;
    }

    protected override void OnModelCreating(ModelBuilder modelBuilder)
    {
        // 应用全局过滤器
    }
}

性能优化方案

  1. 索引优化:建议为TenantID字段建立索引,提升查询效率
  2. 数据分片:对于数据量大的场景,推荐采用分库分表策略
  3. 缓存机制:引入缓存层,避免高频重复查询数据库
  4. 数据维护:建立定期清理机制,及时清除无效租户数据

实施建议:共享表结合租户ID的模式是最简单且通用的解决方案,可根据实际业务需求选择最适合的优化方案。

相关推荐
SEO-狼术2 小时前
Enable Secure Communication with TLS Support
.net
VX:Fegn08953 小时前
计算机毕业设计|基于springboot + vue音乐管理系统(源码+数据库+文档)
java·数据库·vue.js·spring boot·后端·课程设计
一招定胜负3 小时前
navicat连接数据库&mysql常见语句及操作
数据库·mysql
热心市民蟹不肉3 小时前
黑盒漏洞扫描(三)
数据库·redis·安全·缓存
chian_ocean3 小时前
openEuler集群 Chrony 时间同步实战:从零构建高精度分布式时钟体系
数据库
幌才_loong3 小时前
.NET8 实时通信秘籍:WebSocket 全双工通信 + 分布式推送,代码实操全解析
后端·.net
Databend3 小时前
构建海量记忆:基于 Databend 的 2C Agent 平台 | 沉浸式翻译 @ Databend meetup 上海站回顾及思考
数据库
αSIM0V4 小时前
数据库期末重点
数据库·软件工程
2301_800256114 小时前
【第九章知识点总结1】9.1 Motivation and use cases 9.2 Conceptual model
java·前端·数据库
不会写程序的未来程序员4 小时前
Redis 的核心机制(线程模型、原子性、Bigkey、单线程设计原因等)
数据库·redis