Я ищу шаблон для работы в ситуации, когда запись в таблице может быть связана с 1 и только с одной из нескольких других записей, и мне нужно знать, с какой. Это сложно описать, поэтому я буду использовать пример с клиентом oauth из недавнего проекта.
У клиента есть идентификатор и секрет, и команды или пользователи могут владеть клиентами
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 для частей системы не является проблема).
Мне бы хотелось услышать, как люди решают эту проблему.
Заранее спасибо.