SaaS-租户特定查找数据在共享数据库(SaaS- Tenant Specific Lookup D

2019-08-01 12:19发布

我正在开发的多租户SaaS的基础应用,并与共享数据库会存储所有租户记录与TenantId柱的帮助。

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

GamesTable

Id
GameName

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

TenantGames

Id
TenantId
GameName  

基本需要的是我想用两个表中的数据,并获得必要的细节(GAME_NAME),而与像UserGames另一个事务表连接。 我怎么能这样的设计实现这一目标? 这里GAME_NAME可以从共用的游戏表或TenantSpecificGames表被称为任

是否有任何其他数据库的设计,让我做JOIN混合使用这两个公用的主数据和租户主数据?

基本要求是保持共同的数据,并允许定制的租户,如果他们想增加任何新项目。

Answer 1:

这是设计的话,我会用。

游戏

Id
GameName
IsTenantSpecific
SomeGameSpecificColumn

TenantGames

GameId
TenantId
SomeTenantSpecificColumn
AnotherTenantSpecificColumn

然后你就可以查询与加入该表:

...
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
    )

游戏特定字段可以放在Games表。 租户特定字段可以被添加到TenantGames表,这些领域将是NULL,如果它不是一个特定于租户的定制。



Answer 2:

我们有一个基于SaaS的数据库和我们保持共同的数据和承租人数据在同一个表。

概念

GamesTable

    Id NOT NULL
    TenantId NULL
    GameName NOT NULL
    Add a unique key for TenantId and GameName
  • 如果TenantId为NULL,你知道这是常见的数据
  • 如果TenantId是NOT NULL,你知道它属于特定租户和到底是谁。

“是否有任何其他数据库的设计,让我做混合使用这两个公用的主数据和承租人的主数据与加入?”

SELECT *
  FROM GamesTable where TenantId = 'your tenant id'
  UNION
SELECT *
  FROM GamesTable where TenantId IS NULL  -- common 


Answer 3:

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

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 )。 从逻辑上讲,坦游戏不能同时是高手的游戏。



Answer 4:

您可以合并留下TenantId为NULL你想不租户特定的记录表。

游戏

Id
TenantId
GameName

在您可以查询该表与加入:

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

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

这将节省您的保证标识表之间唯一的,除非你正在使用的ID的唯一标识符的麻烦。



文章来源: SaaS- Tenant Specific Lookup Data in Shared Database