友情的Mysql表 - 在查询时导致复杂化的设计问题

时间:2013-11-04 14:26:52

标签: mysql sql

我没有设计每个关系有两个记录的数据库,而是选择了一行。让自己陷入困境!

这是表格:

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模式,每个关系有两行,它会更好吗?

1 个答案:

答案 0 :(得分: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个时间戳列。)

但只有你能够做出那些设计决定。