将多对多相关数据集提取到单个结构中

时间:2019-04-18 18:57:20

标签: sql database postgresql go

我尝试将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 
}

我要问的是:将数据提取到结构中的最佳策略是什么?

  1. 通过查询获取用户记录,通过另一个查询获取其所有分配的角色,并构建User结构。

  1. 通过一次查询获取用户记录及其所有分配的角色。

我知道如何处理第一种情况,但要解决第二种情况。我正在使用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

有什么建议吗?

0 个答案:

没有答案