db模式

xmjla07d  于 2021-07-24  发布在  Java
关注(0)|答案(2)|浏览(299)

我正在寻找一种模式来处理这样一种情况:表中的一个记录可能与1相关,而只与其他几个记录中的一个相关,我需要知道是哪个。这很难描述,所以我将使用一个来自最近项目的oauth客户机的示例。
客户机有id和secret,团队或用户可能拥有客户机

clients
client_id|client_secret

user_clients
user_id|client_id

team_clients
team_id|client_id

这里的问题是,当有人试图使用客户端凭据来获取访问令牌时,我需要知道这些凭据是属于某个团队还是属于某个用户。我不确定处理这个问题的最佳方法,我控制数据库以便进行更改。
我考虑过的一些选择:

Modify clients and remove user_clients and team clients

clients
client_id|client_secret|team_id(nullable)|user_id(nullable)
Create a client owners table and remove user_clients and team_clients

client_owners
team_id(nullable)|user_id(nullable)|client_id
Adding a type to the clients table and doing 2 queries or a conditional query

clients
client_id|client_secret|type(user or team)
Left joins and filtering/mapping in code.

select * from clients c left join user_clients u ... left join team_clients t ... where c.client_id = ?

这些选择都感觉不太好,所以我想知道是否有更好的模式。这是一个简化的示例,有时这些对象要复杂得多,并且有更多可能的关系,因此在使用orm时,查询可能会变得非常复杂,而且也很难管理(尽管系统的某些部分需要原始sql不是问题)。
我很想听听人们是如何解决这个问题的。
提前谢谢。

dwthyt8l

dwthyt8l1#

设计

你所描述的是1:n关系:
一个用户可以拥有多个客户端
一个团队可以拥有多个客户
因此,第一种方法是适当的:client表有一个user列和一个client列。
现在你说客户端只能由用户或客户端拥有。在client表上有一个检查约束,以确保只设置了一个id(如果每个客户机都必须有一个所有者,那么这个约束也会考虑到这一点。)

一些示例查询

如果要获取用户拥有的所有客户端:

select * from clients where user_id is not null;

如果您想知道客户机是属于用户还是团队:

select
  c.*,
  case when user_id is not null then 'user' 
       when team_id is not null then 'team' 
                                else 'none'
  end as owner
from clients c;

如果需要用户或团队信息:

select c.*, coalesce(u.name, t.name) as owner_name
from clients c
left join users u on u.user_id = c.user_id
left join teams t on t.team_id = c.team_id;
kuarbcqp

kuarbcqp2#

左连接的想法是你可以接受的。留下你的 clients 一张table clientID 把它放在左边 user_clients 以及 team_clients .
您还可以将其与第一个选项结合起来,并为其添加一列 user_clientsID 以及 team_clientsID 在左连接处添加 clients.user_clientsID <> 0 这将有助于你解决问题。
第二个和第三个选项也是我见过的。第二种选择可能是有时最令人头痛的。
您还可以考虑创建一个包含所有可能需要的信息的视图表

相关问题