欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

.NET SAAS 架构与设计 -SqlSugar ORM

程序员文章站 2022-07-01 08:35:54
...

1、数据库设计
常用的Saas分库分为2种类型的库

1.1 基础信息库
主要存组织架构 、权限、字典、用户等 公共信息

性能优化:因为基础信息库是共享的,所以我们可以使用 读写分离,或者二级缓存来进行性能上的优化

2.2 业务库
我们要进行的分库都基于业务库进行分库,例如 A集团使用 A01库 ,B集团使用B01库 ,也可以多个小集团使用一个 数据库

如下:

业务库1 :集团A

业务库2 : 集团B, 集团F

业务库3 : 集团C, 集团D, 集团E

性能优先:因为合理的进行了分库,所以在性能上并没有什么瓶颈,并且数据库可以扔到不同的服务器上

2、表设计
下面的表设计的比较简单,主要是通过用户可以拿到当前用户的连接字符串,然后进行数据库操作

2.1 数据库配置表
主键、数据库连接信息、集团ID (基础信息库)

2.2 用户表
主键、用户名、密码、集团ID (基础信息库)

3、代码编写
下面的代码很简单,我们通了多租户方式实现了动态根据用户获取不同的业务库

操作业务库我们使用 DbManger.BizDb

操作基础信息库我们使用 DbManger.MasterDb

如果我们要用到事务就用 DbManger.Db

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
///
/// 数据库管理
///
public class DbManger
{

  /// <summary>
  /// 获取业务库对象
  /// </summary>
   public static ISqlSugarClient BizDb
   {
       get
       {
           UserInfo user = GetUserInfo();//获取用户数据库连接字符串信息
           var configId = user.OrgId.ToString();//集团ID(也可以叫租户ID)
           if(!Db.IsAnyConnection(configId)){
                 Db.AddConnection(new ConnectionConfig() {
                   ConfigId = configId,
                   ConnectionString = "DataSource=" + user.Connection,
                   DbType = DbType.SqlServer,
                    IsAutoCloseConnection = true });
           }     
           var result=Db.GetConnection(configId);
          //可以给业务库result设置AOP
           return result;
       }
   }


   /// <summary>
   /// 基础信息库
   /// </summary>
   public static ISqlSugarClient MasterDb
   {
       get
       {
           //如果是跨服务库分库,也需要动态配置的,因为库的IP会变
           //参考业务库用法
           return Db.GetConnection("default");
       }
   }


   /// <summary>
   /// 利用SqlSugarScope单例+多租户来处理多库事务
   /// </summary>
   public static SqlSugarScope Db =new SqlSugarScope(new ConnectionConfig()
   {
       ConfigId="default",
       DbType = SqlSugar.DbType.SqlServer,
       ConnectionString =  @"基础信息库连接字符串",
       IsAutoCloseConnection = true
   },
    db =>
    {
        //基础库AOP
        db.Aop.OnLogExecuting = (s, p) =>
        {
                        
        };

    });

   /// <summary>
   /// 获取用户数据库连接字符串信息
   /// </summary>
   /// <returns></returns>
   private static UserInfo GetUserInfo()
   {
       throw new System.NotImplementedException();
   }

}
使用用例,继承后直接使用

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
public class OrderManger: DbManger
{
public void Test()
{
try
{
Db.BeginTran();//用Db管理 MasterDb和BizDb事务

           MasterDb.Insertable(xxx).ExecuteCommand();//操作基础信息库
           BizDb.Insertable(xxx).ExecuteCommand();//操作业务库


           Db.CommitTran();//统一事务

        }
       catch (System.Exception ex)
       {
           Db.RollbackTran();
           throw ex;
       };
   }

}

4、跨库查询
4.1 跨库同服务器
跨库查询我们要用BizDb进行查询,因为BizDb是多变的,而MasterDb是固定的,查询用BizDb为主

1
2
3
4
5
6
var List = BizDb.Queryable()
.LeftJoin((o, cus) => o.CustomId == cus.Id)
.AS(“SQLSUGAR4XTEST.dbo.Custom”) //主表用AS("") 从表用AS("")
.Where(o => o.Id == 1)
.Select((o, cus) => new ViewOrder { Id = o.Id, CustomName = cus.Name })
.ToList();
生成的SQL如下:

1
2
3
4
5
SELECT [o].[Id] AS [Id] ,
[cus].[Name] AS [CustomName]
FROM [Order] o
Left JOIN [SQLSUGAR4XTEST].[dbo].[Custom] cus --生成的Sql就多了库名
ON ( [o].[CustomId] = [cus].[Id] ) WHERE ( [o].[Id] = @Id0 )
亚马逊测评 www.yisuping.cn