2011-04-27 28 views
0

我有一個非常典型的用戶表設置爲我的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可以讓用戶靈活地更改用戶名,但我不會讓他們這樣做。任何建議都會很棒。

謝謝

回答

1

加入ID不會太差。該ID可能較小以存儲在磁盤上。另外,我會想象一個朋友列表除了用戶名之外還有其他的東西,在這種情況下,無論如何你都必須加入。

1

那麼,正如你所說,使用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

1

如果您使用數字值,則ID會更小。索引搜索也會更快。 Here你會發現MySQL 5.0的數據類型。

另外我不知道你如何使用索引,但我建議添加和自動增加字段。你可以做一個表,一個整數索引是這樣的:

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