我正在开发的多租户SaaS的基础应用,并与共享数据库会存储所有租户记录与TenantId柱的帮助。
现在的问题是我有需要为所有住户共享查找记录的一些列表。 对于游戏例如列表。
GamesTable
Id
GameName
也有用于存储仅在特定租户记录另一个表
TenantGames
Id
TenantId
GameName
基本需要的是我想用两个表中的数据,并获得必要的细节(GAME_NAME),而与像UserGames另一个事务表连接。 我怎么能这样的设计实现这一目标? 这里GAME_NAME可以从共用的游戏表或TenantSpecificGames表被称为任
是否有任何其他数据库的设计,让我做JOIN混合使用这两个公用的主数据和租户主数据?
基本要求是保持共同的数据,并允许定制的租户,如果他们想增加任何新项目。
这是设计的话,我会用。
游戏
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,如果它不是一个特定于租户的定制。
我们有一个基于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
这是“多对多”的典型例子。
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
)。 从逻辑上讲,坦游戏不能同时是高手的游戏。
您可以合并留下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的唯一标识符的麻烦。