朋友表 - 存储用户ID或用户名?

问题描述:

我有一个非常典型的用户表设置为我的web应用程序:朋友表 - 存储用户ID或用户名?

user_id | username 
-------------------- 
    0   greg 
    1   john 
    ...   ... 

两个字段建立索引和唯一的,这样我就可以通过ID或用户名快速查找用户。

我想保持一个朋友的表,我不知道是否将USER_ID值或用户名存储在该表:

user_id_1 | user_id_2 
-------------------------- 

      or 

username_1 | username_2 
-------------------------- 

我会希望得到好友列表的用户,所以这将是方便立即在朋友表的,而不是做对用户表的连接的用户名:

select * from friends where username_1 = 'greg'; 

如果我存储的用户ID,我需要做一个连接,然后得到的用户名 - 那会很贵吗?:

select * from friends 
    where user_id_1 = x 
    join users where user_id = { all those results } 

使用用户ID可以让用户灵活地更改用户名,但我不会让他们这样做。任何建议都会很棒。

谢谢

加入ID不会太差。该ID可能较小以存储在磁盘上。另外,我会想象一个朋友列表除了用户名之外还有其他的东西,在这种情况下,无论如何你都必须加入。

那么,正如你所说,使用ID语义意味着你可以改变用户名,而不必处理级联效应。对于大多数情况下PK/UNQ + FK索引会使联接快速进行,但是对于大型表(您最终需要某种外部索引或其他工具)您可能有一定的意义。

+0

哦,你能避免类似的东西内查询:'SELECT * FROM朋友˚F内用户加入U ON(f.user_id2 = u.user_id)其中f.user_id1 = [id]' – 2011-04-27 22:06:31

+0

是的,我的用户每个人可能不会超过50个朋友。 – user291701 2011-04-28 15:53:59

如果您使用数字值,则ID会更小。索引搜索也会更快。 Here你会发现MySQL 5.0的数据类型。

另外我不知道你如何使用索引,但我建议添加和自动增加字段。你可以做一个表,一个整数索引是这样的:

ALTER TABLE `Database`.`tableName` ADD COLUMN `indexName` INTEGER NOT NULL AUTO_INCREMENT