私は本当にPostgresqlの複雑なクエリに悩まされています。ユースケースは、システムにユーザー、グループ、およびポリシーがあることです。ユーザーは複数のグループに属し、ポリシーはグループまたはユーザーのいずれかに属します。これは以下のようにモデル化される。SQLで複数のテーブルからリレーションを選択
CREATE TABLE "user" (
id BIGSERIAL NOT NULL,
username CHARACTER VARYING(64) NOT NULL UNIQUE,
hashed_password CHARACTER VARYING(64) NOT NULL,
ldap BOOLEAN DEFAULT FALSE,
PRIMARY KEY (id)
);
CREATE TABLE "group" (
id BIGSERIAL NOT NULL,
name CHARACTER VARYING(64) NOT NULL UNIQUE,
PRIMARY KEY (id)
);
CREATE TABLE "user_group" (
user_id BIGINT NOT NULL,
group_id BIGINT NOT NULL,
PRIMARY KEY (user_id, group_id),
FOREIGN KEY (user_id) REFERENCES "user"(id),
FOREIGN KEY (group_id) REFERENCES "group"(id)
);
CREATE TABLE "policy" (
id BIGSERIAL NOT NULL,
user_id BIGINT,
group_id BIGINT,
effect VARCHAR(5),
action TEXT,
resource TEXT,
PRIMARY KEY (id),
FOREIGN KEY (user_id) REFERENCES "user"(id),
FOREIGN KEY (group_id) REFERENCES "group"(id)
);
は、今私は自分のユーザIDは、ユーザーのグループに基づいてポリシーと組み合わせる基づいてユーザのポリシーをチェックする必要があると私は、ユーザー情報とそれらを結合します。
ID=1
のグループに属しているため、ID=1
のユーザーにはポリシーが必要ですが、これは表示されません。
政策に今あるデータがこのされています使用したクエリはこれです
id=1
user_id=<null>
group_id=1
...
:
SELECT
p.effect,
p.action,
p.resource,
u.*
FROM policy AS p
LEFT JOIN "user" AS u ON p.user_id = u.id
LEFT JOIN "group" AS g ON p.group_id = g.id
LEFT JOIN user_group AS ug ON u.id = ug.user_id
WHERE p.user_id = ug.user_id OR p.group_id = ug.group_id AND ug.user_id = 1;
クエリを表示してください –
@VaoTsunがクエリを追加しました。 – mmjmanders
「USER」と「GROUP」の両方が予約語です。私は複数のテーブル名とsingularis列名を好む。 – jarlh