我的应用程序将允许用户拥有联系人列表。这是我目前的架构:
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张桌子。我目前没有看到由于此更改而发生的问题。这值得改变吗?对于我可能没有意识到的任何一种方法,还有其他任何优点吗?推荐哪个?
答案 0 :(得分:2)
另一个优势可能是拥有此status
(INT
或CHAR
),记录请求(Q
),已接受的联系人({{1} }),拒绝请求(C
),拒绝和重新请求(J
),列入黑名单(R
)以及可能的其他状态,以便您可以更轻松地应用更复杂的逻辑,例如“当用户被拒绝两次时,用户不能再次请求联系人“等等
答案 1 :(得分:1)
值得改变的原因不止一个;如你所说,它会让你少一张桌子。但更重要的是,它可以让您避免人们请求与他们已经添加的人联系,而无需查询额外的表格。
答案 2 :(得分:0)
在某种意义上将它们保持为两个表是更清洁的。您可以清除并保持queue
表小,而不必过滤掉非实际联系人。听起来你真的不需要在同一个表中查看联系人和请求,所以没有理由将它们混合在一起只是为了它。
另一方面,我能看到的唯一好处就是你,嗯,数据库中只有一个表少?在联系表本身和请求表中同时存在一个非常模糊的,无法偶然发生联系(时间错误或其他)。