0

我正在开发基于多租户 SaaS 的应用程序,并使用共享数据库在 TenantId 列的帮助下存储所有租户记录。

现在的问题是我有一些需要为所有租户共享的查找记录列表。例如游戏列表。

游戏桌

Id
GameName

还有另一个表用于仅存储租户特定的记录

租户游戏

Id
TenantId
GameName  

基本需求是我想在加入另一个事务表(如 UserGames)时同时使用表数据并获取必要的详细信息(Game_Name)。我怎样才能通过这种设计实现这一目标?此处 Game_Name 可以从 Games Shared 表或 TenantSpecificGames 表中引用

是否有任何其他数据库设计允许我将公共主数据和租户主数据与 JOIN 混合在一起?

基本要求是保留公共数据并允许租户在他们想要添加任何新项目时进行自定义。

4

4 回答 4

1

我们有一个基于 saas 的数据库,我们将通用数据和租户数据保存在同一个表中。

概念

GamesTable

    Id NOT NULL
    TenantId NULL
    GameName NOT NULL
    Add a unique key for TenantId and GameName
  • 如果 TenantId 为 NULL,您就知道这是公共数据
  • 如果 TenantId 不为 NULL,则您知道它属于特定租户以及确切的租户。

“是否有任何其他数据库设计允许我将公共主数据和租户主数据与 JOIN 混合在一起?”

是的

SELECT *
  FROM GamesTable where TenantId = 'your tenant id'
  UNION
SELECT *
  FROM GamesTable where TenantId IS NULL  -- common 
于 2012-10-19T00:24:15.823 回答
1

这是我将使用的设计。

游戏

Id
GameName
IsTenantSpecific
SomeGameSpecificColumn

租户游戏

GameId
TenantId
SomeTenantSpecificColumn
AnotherTenantSpecificColumn

然后,您可以在 Join 中查询该表:

...
FROM
    Games
    INNER JOIN UserGames ON
        UserGames.GameId = Games.Id
    LEFT JOIN TenantGames ON
        TenantGames.GameId = Games.Id
WHERE
    TenantGames.TenantId = @tenantId OR
    (
        TenantGames.TenantId IS NULL AND
        IsTenantSpecific = 0
    )

游戏特定字段可以放在游戏表中。租户特定字段可以添加到 TenantGames 表中,如果不是特定于租户的自定义,这些字段将为 NULL。

于 2012-10-22T23:09:40.460 回答
0

这是“多对多”的经典例子。

Table: Games
------------
GameID
GameName
IsMasterGame


TennantGames
------------------
GameID
TennantID

Tennants
------------
TennantID
...

要获取给定租户的游戏,您可以运行如下查询:

select *
from   Games
where isMasterGame = true
union
select * 
from Games g, 
TennantGames tg
where g.GameID = tg.GameID
and   isMasterGame = false
and   tg.TennantID = $currentTennant

(为过时的连接语法道歉)

工会允许您提出两个问题:哪些游戏适用于所有人 ( isMasterGame = true),其次哪些游戏适用于当前租户 ( tg.TennantID = $currentTennant)。从逻辑上讲,租户游戏也不可能是大师游戏。

于 2012-10-16T09:24:49.907 回答
0

对于您不希望特定于租户的记录,您可以合并表,将 TenantId 保留为 NULL。

游戏

Id
TenantId
GameName

您可以在 Join 中查询该表:

...
FROM
    Games
    INNER JOIN UserGames ON
        UserGames.GameId = Games.Id

WHERE
    Games.TenantId = @tenantId OR
    Games.TenantId IS NULL

这将为您省去确保 Id 在表之间唯一的麻烦,除非您对 Id 使用 UNIQUEIDENTIFIER。

于 2012-10-22T12:35:22.690 回答