0

我没有设计每个关系有两条记录的数据库,而是选择了 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

我面临的第二个问题是当前用户的更新状态。如果他接受友谊,我如何更新 status_1 或 status_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 回答