我正在开发基于SaaS的多租户应用程序,并使用共享数据库在TenantId列的帮助下存储所有租户记录。
现在问题是我有一些需要为所有租户共享的查找记录列表。例如游戏列表。
GamesTable
Id
GameName
还有另一个用于存储租户特定记录的表
TenantGames
Id
TenantId
GameName
基本需求是我想要同时使用两个表数据并获取必要的详细信息(Game_Name),同时加入另一个事务表,如UserGames。我怎样才能通过这种设计实现这一目标? 此处Game_Name可以从Games Shared table或TenantSpecificGames表中引用
是否有其他数据库设计允许我将公共主数据和租户主数据与JOIN混合使用?
基本要求是保留常用数据,并允许租户自定义,如果他们想要添加任何新项目。
答案 0 :(得分:1)
我们有一个基于saas的数据库,我们将公共数据和租户数据保存在同一个表中。
GamesTable
Id NOT NULL
TenantId NULL
GameName NOT NULL
Add a unique key for TenantId and GameName
“是否有任何其他数据库设计允许我混合两种常见的 使用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的麻烦。