繁体   English   中英

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

[英]Database schema, 1 table or 2 tables

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

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表,然后从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张。 我目前看不到此更改导致的问题。 值得改变吗? 我可能不知道这两种方法是否还有其他优点。 推荐哪个?

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

出于多个原因,值得对此进行更改。 如您所说,它将减少您一张桌子。 但是,更重要的是,它可以使您避免人们请求与已经添加的人进行联系而无需查询额外的表。

将它们保留为两个表在某种意义上会更清洁。 您可以清除queue列表并使其较小,而不必继续过滤掉不真实的联系人。 听起来您根本不需要真正查看同一表中的联系人和请求,因此没有理由仅出于此目的将它们混在一起。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM