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
)以及可能的其他状态,以便您可以更轻松地应用更复杂的逻辑,如“用户在两次被拒绝时无法再次请求联系人”等。谢谢。我目前没有使用这种逻辑,但如果我决定实施它,我肯定会看到这种方法在哪里是有用的。“它将允许您避免人们请求与他们已经添加的人联系,而不必查询额外的表”这是一个+我想我应该提到,我会显示联系人和联系请求这样。我已决定将其更改为使用单个表,并在出现任何问题时恢复。谢谢你的回答。