sql - 将多对多相关数据集提取到单个结构中
问题描述
我尝试将 RBAC 授权系统构建到应用程序中。用户、角色和权限存储在数据库中。每个角色都可以分配给每个用户。这就是为什么我有一个user_account
和一个role
表通过连接表粘合在一起形成多对多关系user_role
。精简后,数据库设置如下所示:
CREATE TABLE user_account (
id uuid NOT NULL DEFAULT uuid_generate_v1mc(),
email character varying(128) NOT NULL,
CONSTRAINT user_account_pkey PRIMARY KEY (id),
CONSTRAINT user_account_email_key UNIQUE (email)
);
CREATE TABLE role (
id uuid NOT NULL DEFAULT uuid_generate_v1mc(),
name character varying(128) NOT NULL,
CONSTRAINT role_pkey PRIMARY KEY (id),
CONSTRAINT role_name_key UNIQUE (name)
);
CREATE TABLE user_role (
user_id uuid NOT NULL,
role_id uuid NOT NULL,
CONSTRAINT user_role_pkey PRIMARY KEY (user_id, role_id),
CONSTRAINT user_role_fkey_user FOREIGN KEY (user_id) REFERENCES user_account (id) ON DELETE CASCADE,
CONSTRAINT user_role_fkey_role FOREIGN KEY (role_id) REFERENCES role (id) ON DELETE CASCADE
);
显然我已经设置了匹配的 go 结构:
type User struct {
ID string `db:"id"`
Email string `db:"email"`
}
type Role struct {
ID string `db:"id"`
Name string `db:"name"`
}
到目前为止,一切都很好。将一行或多行单独提取到匹配的 go 结构中不是问题。但我更愿意获取用户及其所有分配的角色。生成的 go 结构看起来像这样:
type User struct {
ID string `db:"id"`
Email string `db:"email"`
Roles []Role
}
我要问的是:将数据提取到结构中的最佳策略是什么?
- 使用查询获取用户记录,使用另一个查询获取其分配的所有角色并构建
User
结构。
或者
- 使用单个查询获取用户记录及其所有分配的角色。
我知道如何做第一个案例,但在第二个案例中挣扎。我正在使用sqlx
和 PostgreSQL。我试图实现的目标是否可能?如果是,如何?使用哪个db
标签?
我对方法二的天真查询看起来像这样,但显然不能按预期工作:
SELECT user_account.id, user_account.email, role.id, role.name
FROM user_account
LEFT OUTER JOIN user_role
ON user_account.id = user_role.user_id
LEFT OUTER JOIN role
ON user_role.role_id = role.id
有什么建议么?
解决方案
推荐阅读
- python - 无法将小部件添加到左侧
- c - Windows 结构初始化错误 C2099:初始化程序不是常量
- r - 使用 R 将 Amazon ProductAdvertisingAPI 从 v4 转换为 v5
- firebase - 修复了在 firebase onCall 上被 CORS 政策阻止的问题
- c# - 如何使用 LINQ 编写带有“in”关键字的 Cosmos DB 查询?
- linux - in linux char device driver, what does the poll_queue_proc function do?
- javascript - Javascript:paymentRequest到底是什么?关联数组?JSON对象?
- batch-file - 如何在 Windows 批处理文件中检查 curl ftp 上传是否成功
- typescript - 有没有办法(或解决方法)解构打字稿类型/接口?
- functional-programming - SML 匹配表达式中的模式是否应该具有相同的类型?