SaaS-共享数据库中的租户特定查找数据

时间:2012-10-16 09:17:46

标签: database database-design saas multi-tenant

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

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

GamesTable

Id
GameName

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

TenantGames

Id
TenantId
GameName  

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

是否有其他数据库设计允许我将公共主数据和租户主数据与JOIN混合使用?

基本要求是保留常用数据,并允许租户自定义,如果他们想要添加任何新项目。

4 个答案:

答案 0 :(得分: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 

答案 1 :(得分:1)

这是我将使用的设计。

<强>游戏

Id
GameName
IsTenantSpecific
SomeGameSpecificColumn

<强> TenantGames

GameId
TenantId
SomeTenantSpecificColumn
AnotherTenantSpecificColumn

然后,您可以在Join with:

中查询该表
...
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。

答案 2 :(得分:0)

这是&#34;多对多的典型例子。

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


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

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

要获得给定Tennant的游戏,您可以运行如下查询:

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)。从逻辑上讲,Tennant游戏也不能成为高手游戏。

答案 3 :(得分:0)

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

<强>游戏

Id
TenantId
GameName

您可以在Join with:

中查询该表
...
FROM
    Games
    INNER JOIN UserGames ON
        UserGames.GameId = Games.Id

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

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