.NET SAAS 架构与设计 -SqlSugar ORM

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
{

  /// 
  /// 获取业务库对象
  /// 
   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;
       }
   }


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


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

    });

   /// 
   /// 获取用户数据库连接字符串信息
   /// 
   /// 
   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

你可能感兴趣的:(.net,架构,数据库)