BigInt或varchar(40)和autoincrement id还是没有id? SQL

时间:2015-09-12 21:41:57

标签: php mysql

我的公司将为网络论坛做一个关注系统。 这个论坛有超过100万会员,其中一个可以跟随其他会员在论坛上看到这些会员的帖子。

首先,我做了一个这样的表:

CREATE TABLE IF NOT EXISTS `following` (
  `id` int(11) UNSIGNED NOT NULL AUTO_INCREMENT,
  `user` varchar(40) NOT NULL,
  `following` varchar(80) NOT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 AUTO_INCREMENT=1 ;

我的办公室朋友告诉我,我应该使用USER ID代替user(跟随的人)和following(另一个)行中的用户名。他是对的吗?

问题1:以这种方式更好的是使用BigInt unsigned而不是Varchar并使用用户ID而不是用户名吗?

问题2:他还告诉我,我应该删除id auto_increment,因为我不使用它(我插入用户并删除使用user ='$ user'和follow ='$ following')。他是对的吗?或者auto_increment很重要?

谢谢各位朋友!

1 个答案:

答案 0 :(得分:1)

你怎么看?比较八字节密钥(BIGINT)或变长度40字节密钥(VARCHAR(40))是否更有效?显然,BIGINT密钥会更有效率。是的,为了提高DBMS效率,您应该使用BIGINT甚至INT值作为用户的唯一标识符。 INT就够了。如果您实际获得的用户数超过2 x 10 ** 9,则会出现Facebook大小的问题和Facebook大小的预算。在此之前,让您的项目正常运作。 YAGNI

您所描述的此表是否旨在实现用户与其他用户之间直接的多对多关系?追随者可以多次关注用户吗?如果没有,请删除此表中的代理主键(自动增量ID)。而是将主键设置为user_id和following_id列的组合。

如果这是我的项目,我会将(user_id, follower_id)作为主键,我还会在follower_id上创建一个索引。 (如果MyISAM是访问方法,则第二个索引应该在(follower_id, user_id)上。)除了主键之外不需要另一个索引,它完全是多余的。