我正在寻找一种模式来处理这样一种情况:表中的一个记录可能与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不是问题)。
我很想听听人们是如何解决这个问题的。
提前谢谢。
2条答案
按热度按时间dwthyt8l1#
设计
你所描述的是1:n关系:
一个用户可以拥有多个客户端
一个团队可以拥有多个客户
因此,第一种方法是适当的:client表有一个user列和一个client列。
现在你说客户端只能由用户或客户端拥有。在client表上有一个检查约束,以确保只设置了一个id(如果每个客户机都必须有一个所有者,那么这个约束也会考虑到这一点。)
一些示例查询
如果要获取用户拥有的所有客户端:
如果您想知道客户机是属于用户还是团队:
如果需要用户或团队信息:
kuarbcqp2#
左连接的想法是你可以接受的。留下你的
clients
一张tableclientID
把它放在左边user_clients
以及team_clients
.您还可以将其与第一个选项结合起来,并为其添加一列
user_clientsID
以及team_clientsID
在左连接处添加clients.user_clientsID <> 0
这将有助于你解决问题。第二个和第三个选项也是我见过的。第二种选择可能是有时最令人头痛的。
您还可以考虑创建一个包含所有可能需要的信息的视图表