我的Web应用程序有一个非常典型的用户表设置:
user_id | username
--------------------
0 greg
1 john
... ...
这两个字段都是索引且唯一的,因此我可以快速按ID或用户名查找用户。
我想保留一个朋友表,并且不确定是否在该表中存储user_id值或用户名:
user_id_1 | user_id_2
--------------------------
or
username_1 | username_2
--------------------------
我想要获得一个用户的朋友列表,所以在friends表中立即拥有用户名而不是在users表上进行连接会很方便:
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允许我让用户灵活地更改用户名,但我不会让他们这样做。任何建议都会很棒。
由于
答案 0 :(得分:1)
对ID的加入不会太糟糕。 ID可能较小,可以存储在磁盘上。此外,我认为朋友列表中除了用户名之外还有其他东西,在这种情况下,无论如何都必须加入。
答案 1 :(得分:1)
好吧,正如你所说,使用id语义意味着你可以更改用户名而无需处理级联效果。对于大多数情况下,PK / UNQ + FK索引会使连接快速响应,但是你可能有一个巨大的表(对于你最终需要某种外部索引或其他工具)。
答案 2 :(得分:1)
如果使用数值,ID将会更小。索引搜索也会更快。 Here您将找到MySQL 5.0的数据类型。
另外,我不知道你是如何使用索引的,但我建议添加和自动增加字段。您可以对表执行此操作,对于这样的整数索引:
ALTER TABLE `Database`.`tableName` ADD COLUMN `indexName` INTEGER NOT NULL AUTO_INCREMENT