私はMySQL 8.0を使用していて、2つの列int UserIDとtinyint GroupIDを持つACLテーブルがあります。どちらも複合主キーを形成します。ユーザーは多くのグループに所属できますが、そのようなグループ(管理者、モデレーターなど)を持っているユーザーはごくわずかです。ログイン時にユーザーのACLグループを取得する必要がありますが、そのため、ユーザーテーブルとACLテーブルの2つのSELECTクエリを実行する必要があります。
GroupIDのデータ型をJSONに変更し、ユーザーのすべてのグループIDを1つのフィールドに格納するのは良い選択でしょうか?次に、INNER JOINを使用して、1つのクエリですべての必要なデータを取得し、UserIDがACLテーブルの主キーになります。そのような構造またはおそらくより良い解決策に欠点はありますか?私は主にGroupIDフィールドでSELECT操作を使用するつもりですが、UPDATEとINSERTはほとんど使用されません。
ユーザーIDの単一のインデックスを使用すると、簡単かつ迅速にグループをリクエストし、グループからsimlpyユーザーも削除できます。
それはすべてjsonで可能ですが、はるかに多くのコードを必要とするため、さらに多くの問題を引き起こす可能性があります。
アプリケーションでそれを必要とせず、あまり変更しない限り、jsonは大量のデータを格納するのに適していますが、それもxmlです。
見て、たぶんそれはあなたが必要とするクエリですか?
SELECT `UserName`,
`Score`,
GROUP_CONCAT(`GroupID` ) groups_csv,
CAST(CONCAT('[',
GROUP_CONCAT(`GroupID` ),
']') AS JSON) groups_json_array
FROM `User`
INNER JOIN `ACL` ON `User`.UserID = `ACL`.UserID
WHERE `User`.UserID = 1
GROUP BY `UserName`, `Score`;