リレーションシップごとに 2 つのレコードを持つデータベースを設計する代わりに、1 つの行を使用しました。そして自分を困らせた!
これはテーブルです:
CREATE TABLE `friends` (
`id` int(11) unsigned NOT NULL AUTO_INCREMENT,
`user_id_1` int(11) unsigned NOT NULL,
`status_1` tinyint(1) NOT NULL DEFAULT '0',
`user_id_2` int(11) unsigned NOT NULL,
`status_2` tinyint(1) NOT NULL DEFAULT '0',
`created` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
PRIMARY KEY (`id`),
UNIQUE KEY `unique_rela` (`user_id_1`,`user_id_2`),
KEY `user_id_2` (`user_id_2`)
) ENGINE=InnoDB AUTO_INCREMENT=97 DEFAULT CHARSET=utf8;
このデザインにはいくつかの問題があります。
http://www.sqlfiddle.com/#!2/c6ccb8/2
まず、現在のユーザーのステータスを選択できません。現在のユーザーは user_id_1 または user_id_2 のどこにでもいる可能性があるためです。
SELECT DISTINCT
friends.friend_id
FROM (
SELECT created,
CASE user_id_1 WHEN 1 THEN user_id_2
ELSE user_id_1
END AS friend_id
FROM friends
WHERE 1 IN (user_id_1, user_id_2)
) friends
ORDER BY friends.created DESC
私が直面している 2 番目の問題は、現在のユーザーの更新ステータスです。彼が友情を受け入れる場合、status_1 または status_2 の正しい値を更新するにはどうすればよいですか?
この問題の解決策はありますか? それとも、関係ごとに 2 つの行を持つ単純な AB BA スキーマを使用する方がよいでしょうか?