Mysql 数据库架构,1个表或2个表

Mysql 数据库架构,1个表或2个表,mysql,sql,database,database-design,Mysql,Sql,Database,Database Design,我的应用程序将允许用户拥有联系人列表。这是我当前的模式: CREATE TABLE IF NOT EXISTS `contact` ( `id` int(11) NOT NULL AUTO_INCREMENT, `user_id` int(11) NOT NULL, `person_id` int(11) NOT NULL, `create_time` int(11) NOT NULL, PRIMARY KEY (`id`), UNIQUE KEY `user_id` (

我的应用程序将允许用户拥有联系人列表。这是我当前的模式:

CREATE TABLE IF NOT EXISTS `contact` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `user_id` int(11) NOT NULL,
  `person_id` int(11) NOT NULL,
  `create_time` int(11) NOT NULL,
  PRIMARY KEY (`id`),
  UNIQUE KEY `user_id` (`user_id`,`person_id`)
) ENGINE=InnoDB;

CREATE TABLE IF NOT EXISTS `contact_request` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `user_id` int(11) NOT NULL,
  `person_id` int(11) NOT NULL,
  `create_time` int(11) NOT NULL,
  PRIMARY KEY (`id`),
  UNIQUE KEY `user_id` (`user_id`,`person_id`)
) ENGINE=InnoDB;

CREATE TABLE IF NOT EXISTS `user` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `email_address` varchar(50) NOT NULL,
  `username` varchar(32) NOT NULL,
  `password` varchar(32) NOT NULL,
  PRIMARY KEY (`id`),
  UNIQUE KEY `email_address` (`email_address`),
  UNIQUE KEY `username` (`username`)
) ENGINE=InnoDB;
当用户尝试添加另一个用户作为联系人时,将在contact_请求表中创建一条记录。如果接收请求的用户拒绝请求,则删除联系人请求记录。如果用户决定接受请求,则联系人请求表中的数据将添加到联系人表中,然后从联系人请求表中删除

我意识到,我可以通过另一种方式来实现这一点,即删除contact_request表,并在contact表中添加另一个字段,例如:status,表示某个联系人是刚被请求的还是已接受的请求

CREATE TABLE IF NOT EXISTS `contact` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `user_id` int(11) NOT NULL,
  `person_id` int(11) NOT NULL,
  `status` tinyint(1) not null,
  `create_time` int(11) NOT NULL,
  PRIMARY KEY (`id`),
  UNIQUE KEY `user_id` (`user_id`,`person_id`)
) ENGINE=InnoDB;

我看到的优点是我可以少一张桌子。我目前没有看到由于这一变化而出现的问题。这值得改变吗?这两种方法都有其他我可能不知道的优点吗。建议使用哪一种?

从某种意义上说,将它们作为两个表保存会更干净。您可以清除并保持
队列
表较小,而不必一直过滤掉不真实的联系人。听起来您永远不需要在同一个表中查看联系人和请求,因此没有理由仅仅为了查看联系人和请求而将它们混合在一起


另一方面,我能看到的唯一好处是,你,嗯,在数据库中少了一个表?还有一个非常模糊的问题,就是不能在联系人表和请求表中同时存在一个联系人(定时错误或其他原因)。

出于不止一个原因,有必要改变这一点;正如你所说,这将允许你少一张桌子。然而,更重要的是,它允许您避免人们请求与他们已经添加的人联系,而不必查询额外的表。

另一个优点可能是具有此
状态(
INT
CHAR
),记录请求(
Q
),接受的联系人(
C
),拒绝请求(
J
)、拒绝和重新请求(
R
)、列入黑名单(
B
)以及可能的其他状态,以便您可以更轻松地应用更复杂的逻辑,如“用户在两次被拒绝时无法再次请求联系人”等。

谢谢。我目前没有使用这种逻辑,但如果我决定实施它,我肯定会看到这种方法在哪里是有用的。“它将允许您避免人们请求与他们已经添加的人联系,而不必查询额外的表”这是一个+我想我应该提到,我会显示联系人和联系请求这样。我已决定将其更改为使用单个表,并在出现任何问题时恢复。谢谢你的回答。