0

リレーションシップごとに 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 スキーマを使用する方がよいでしょうか?

4

1 に答える 1

0

友情ごとに列を減らし、行を 1 つだけにするために、設計を確認する必要があります。

次のようになります。

id    asker_user_id        asked_user_id        friendship_status        timestamp
198   21                   92                   NULL                     '2013-11-02 9:00:00'
199   27                   92                   1                        '2013-11-03 9:00:00'
198   91                   21                   0                        '2013-11-04 9:00:00'

フレンドシップステータスをどのように管理したいのかわかりません...

  • ステータス テーブルを使用しますか?
  • ステータスを NULL 未応答、1 受け入れ、0 拒否のビットとして使用しますか?
  • タイムスタンプをリクエスト、回答、またはその両方の日付にしたいですか(その場合、2つのタイムスタンプ列があります)。

しかし、これらの設計上の決定を下すことができるのはあなただけです。

于 2013-11-04T14:40:26.090 に答える