実現したいこと
「ユーザA, ユーザB = グループX」のように、複数ユーザを、以下の要件でグループ化したいです。
■要件1
構成要素は順不同でユニークにしたいです。
例えば
「ユーザA, ユーザB = グループY」や
「ユーザB, ユーザA = グループZ」のように、
構成要素が重複した別グループは作りたくありません。
「ユーザA, ユーザB, ユーザC」なら別グループを作ってOKです。
■要件2
グループ内のユーザ数は最大1万とし、ユーザテーブルのIDカラムは INT(10) としたいです。
発生している問題・分からないこと
要件1をクリアする方法は思いつけます。以下のuser_ids
カラムのように、カンマ区切りでユニーク制約をかける方法です。(そして INSERT 前は php 等で user_id をソートします。)
しかし要件2がわかりません。といいますのは、user_ids
カラムにインデックスの最大値とされる3068バイトを持たせても、INT(10)
のユーザが1万人は入りきらないためです。
該当のソースコード
SQL
1CREATE TABLE UserGroup ( 2 group_id INT AUTO_INCREMENT PRIMARY KEY, 3 4 -- "1,2,3,,," のように、User.user_id をカンマ区切りで持つ 5 user_ids VARCHAR(3068) NOT NULL UNIQUE 6); 7 8CREATE TABLE User ( 9 user_id INT(10) AUTO_INCREMENT PRIMARY KEY, 10 user_name VARCHAR(255) NOT NULL, 11 group_id INT, 12 FOREIGN KEY (group_id) REFERENCES UserGroup(group_id) 13);
試したこと・調べたこと
- teratailやGoogle等で検索した
- ソースコードを自分なりに変更した
- 知人に聞いた
- その他
teratailやGoogle等で検索した
グループという名でネット検索すると、GROUP_CONCAT などの処理が出てしまい、今回の要件のような情報を見つけることはできませんでした。
そして、ChatGPT に聞いてもろくな返答はありませんでした。
ソースコードを自分なりに変更した1
User
テーブルに新たにuser_unique
カラムを置いてそこに数字だけでなく英数記号の値を持たせ、UserGroup
テーブルはuser_ids
でなくuser_uniques
とでもすれば、数字だけより多人数を管理できますが、やっぱりそれでも要件2を満たすには足りません。
ソースコードを自分なりに変更した2
すると残るは、UserGroup.user_ids
という1つのカラムにまとめるのではなく、3068バイトずつ分割して別のテーブルに持たせ、それらのレコードのIDを繋げた値をUserGroup.user_id_pattern_ids
として持たせるとかになるのでしょうか?あまりに不細工というか、ちょっとヘンだと思います。
SQL
1CREATE TABLE UserGroup ( 2 group_id INT AUTO_INCREMENT PRIMARY KEY, 3 4 -- "1,2,3,,," のように、UserIdPatterns.user_id_pattern_id をカンマ区切りで持つ 5 user_id_pattern_ids VARCHAR(3068) NOT NULL UNIQUE 6); 7 8CREATE TABLE UserIdPatterns ( 9 user_id_pattern_id INT AUTO_INCREMENT PRIMARY KEY, 10 11 -- "1,2,3,,," のように、User.user_id をカンマ区切りで持つ 12 user_ids VARCHAR(3068) NOT NULL UNIQUE 13); 14 15-- 以下は最初のコードと一緒 16CREATE TABLE User ( 17 user_id INT(10) AUTO_INCREMENT PRIMARY KEY, 18 user_name VARCHAR(255) NOT NULL, 19 group_id INT, 20 FOREIGN KEY (group_id) REFERENCES UserGroup(group_id) 21);
もし良い方法があったら教えてください。
補足
実際にユーザが1万人いるサービスを運営しているわけではありませんが、実現方法として興味があっての質問です。
回答4件
あなたの回答
tips
プレビュー