データベースの正規化を実際に確認する必要があります
まず、ジャンクションテーブルを追加して構造を正規化し、tablecからのリレーションを保持します。tablecに格納されている各リレーションは、新しいジャンクションテーブルに格納されますが、コンマ区切りのリストとしてではなく、各行にcのIDと行ごとに1つのユーザーIDが保持されます。スキーマを変更することはできません。find_in_set
を使用できます。 セット内の値を検索するには
select *
from tblC c
JOIN tblB b
ON (find_in_set(b.userid,c.userids) > 0)
where c.nname="new1"
スキーマを正規化するために編集
userids
を削除しました tblC
の列 代わりに、tblC_user
として新しいジャンクションテーブルを作成しました 2列のc_id
これは、tblC
のid列に関連します 2つ目はuserid
tblC
のユーザーリレーションユーザーを保存する tblC
のサンプルスキーマを参照してください
CREATE TABLE if not exists tblC
(
id int(11) NOT NULL auto_increment ,
nname varchar(255),
PRIMARY KEY (id)
);
INSERT INTO tblC (id, nname) VALUES
('1', 'new1'),
('2', 'new2'),
('3', 'new3'),
('4', 'new4'),
('5', 'new5');
そして、これがtblC_user
としてのjunctionテーブルです。
CREATE TABLE if not exists tblC_user
(
c_id int,
userid int
);
INSERT INTO tblC_user (c_id,userid) VALUES
('1','1'),
('1','2'),
('2','1'),
('2','3'),
('3','1'),
('3','4'),
('4','3'),
('4','2'),
('5','5'),
('5','2');
上記で、tblC
のユーザーの各リレーションにコンマ区切りのリレーションが保存されていないことに気付いた場合 は新しい行に格納されます。関係する結果セットについては、結合でジャンクションテーブルを使用しましたが、新しいクエリは次のようになります
select *
from tblC c
join tblC_user cu on(c.id = cu.c_id)
join tblB b on (b.userid = cu.userid)
where c.nname="new1"
これで、上記のクエリをインデックスを使用して最適化できるようになり、カスケード関係を簡単に維持できます