数据库模式,1个表或2个表

时间:2011-03-13 22:54:46

标签: 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` (`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_request表中创建一条记录。如果接收请求的用户拒绝该请求,则删除contact_request记录。如果用户决定接受请求,则contact_request表中的数据将添加到联系人表中,然后从contact_request表中删除。

我意识到我可以通过另一种方式执行此操作,即删除contact_request表并将另一个字段添加到联系人表中,例如:表示联系人是刚刚被请求的状态还是已接受的请求。

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;

我看到的优点是我可以减少1张桌子。我目前没有看到由于此更改而发生的问题。这值得改变吗?对于我可能没有意识到的任何一种方法,还有其他任何优点吗?推荐哪个?

3 个答案:

答案 0 :(得分:2)

另一个优势可能是拥有此statusINTCHAR),记录请求(Q),已接受的联系人({{1} }),拒绝请求(C),拒绝和重新请求(J),列入黑名单(R)以及可能的其他状态,以便您可以更轻松地应用更复杂的逻辑,例如“当用户被拒绝两次时,用户不能再次请求联系人“等等

答案 1 :(得分:1)

值得改变的原因不止一个;如你所说,它会让你少一张桌子。但更重要的是,它可以让您避免人们请求与他们已经添加的人联系,而无需查询额外的表格。

答案 2 :(得分:0)

在某种意义上将它们保持为两个表是更清洁的。您可以清除并保持queue表小,而不必过滤掉非实际联系人。听起来你真的不需要在同一个表中查看联系人和请求,所以没有理由将它们混合在一起只是为了它。

另一方面,我能看到的唯一好处就是你,嗯,数据库中只有一个表少?在联系表本身和请求表中同时存在一个非常模糊的,无法偶然发生联系(时间错误或其他)。