2011-04-27 3 views
0

У меня есть довольно типичную установку таблицы пользователя для моего веб-приложения:Таблица друзей - хранить идентификаторы пользователей или имена пользователей?

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

Оба поля индексируются и уникальным, так что я могу смотреть на пользователя с идентификатором пользователя или быстро.

Я хочу сохранить таблицу друзей, и я не уверен, следует ли сохранять значения user_id или имена пользователей в этой таблице:

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

      or 

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

Я буду хотеть, чтобы получить список друзей для пользователя, поэтому было бы удобно сразу иметь имена пользователей в таблице друзей вместо того, чтобы делать присоединиться на столе пользователей:

select * from friends where username_1 = 'greg'; 

Если я хранить идентификаторы пользователей, мне нужно сделать присоединиться, то, чтобы получить имена пользователей - будет ли это дорогостоящим ?:

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

Использование идентификаторов пользователей позволяет мне гибко изменять имена пользователей, но я не позволяю им это делать. Будем признательны любому совету.

Благодаря

ответ

1

Объединение по идентификаторам не будет слишком плохо. Идентификатор может быть меньше для хранения на диске. Кроме того, я бы предположил, что список друзей будет иметь нечто иное, чем просто имена пользователей, и в этом случае вы должны присоединиться ни к чему.

1

Ну, как вы сказали, использование семантики id означает, что вы можете изменить имя пользователя, не имея дело с каскадными эффектами. В большинстве случаев индексы PK/UNQ + FK будут быстро грести соединения, но у вас может быть точка для огромных таблиц (для которых вам в конечном итоге понадобится какой-то внешний индекс или другой инструмент).

+0

О, и вы можете избежать этого внутреннего запроса что-то вроде: 'выбрать * из друзей е внутреннего объединения пользователей Мириэля (f.user_id2 = u.user_id), где f.user_id1 = [id] ' –

+0

Да, у моих пользователей, вероятно, не будет более 50 друзей. – user291701

1

Идентификатор будет меньше, если вы используете числовые значения. Также поиск по индексу будет быстрее. Here вы найдете типы данных для MySQL 5.0.

Также я не знаю, как вы используете индекс, но я бы рекомендовал добавлять и автоматически увеличивать поле. Вы можете сделать это в таблицу, для целого индекса, например так:

ALTER TABLE `Database`.`tableName` ADD COLUMN `indexName` INTEGER NOT NULL AUTO_INCREMENT 
Смежные вопросы