Подтвердить что ты не робот

Facebook user_id: big_int, int или string?

Идентификатор пользователя Facebook поднимается до 2 ^ 32, который, по моему мнению, 4294967296.

mySQL unsigned int range - от 0 до 4294967295 (это 1 короткий или моя математика неверна) и его неподписанный большой диапазон int от 0 до 18446744073709551615

int = 4 байта, bigint = 8 байт

ИЛИ

Сохранять ли я его как строку?

varchar (10) =? байты

Как это будет эффективно, я слышал, что номера дескрипторов mysql намного лучше, чем строки (производительность - мудрый). Итак, что вы, ребята, рекомендуете

4b9b3361

Ответ 1

Поскольку Facebook назначает идентификаторы, а не вы, вы должны использовать BIGINT.

Facebook не назначает идентификаторы последовательно, и я подозреваю, что у них есть некоторый режим для присвоения номеров.

Недавно я исправил именно эту ошибку, так что это настоящая проблема.

Я бы сделал UNNIGNED просто потому, что это то, что есть.

Я бы не использовал строку. Это делает сравнение болезненным, а ваши индексы неуклюже, чем они должны быть.

Ответ 2

Вы больше не можете использовать INT. Вчера вечером у меня было два идентификатора пользователя, которые превысили INT (10).

Ответ 3

Я использую bigint для хранения идентификатора facebook, потому что это то, что оно есть.

но внутренне для первичных и внешних ключей таблиц, я использую smallint, потому что он меньше. Но также потому, что если bigint должен когда-либо стать строкой (чтобы найти пользователей по имени пользователя вместо id), я могу легко изменить его.

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

profile
- profile_key smallint primary key
- profile_name varchar
- fb_profile_id bigint

и тот, который выглядит следующим образом

something_else
- profile_key smallint primary key
- something_else_key smallint primary key
- something_else_name varchar

и мои запросы для одной страницы могут быть примерно такими:

select profile_key, profile_name
from profile
where fb_profile_id = ?

теперь я беру profile_key и использую его в следующем запросе

select something_else_key, something_else_name
from something_else
where profile_key = ?

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

И, конечно, также довольно легко кэшировать первый запрос для некоторой дополнительной производительности.

Ответ 4

Если вы читаете это в 2015 году, когда facebook обновил свою версию API до версии 2.0. Они добавили в свою документацию записку о том, что их идентификаторы будут изменены и будут обладать приложением. Так что, возможно, в будущем появится большая вероятность, что они могут изменить все идентификаторы на цифру Alpha.

https://developers.facebook.com/docs/apps/upgrading#upgrading_v2_0_user_ids Поэтому я бы предложил сохранить тип в varchar и избежать любых будущих миграционных болей.

Ответ 5

Ваша математика немного неправильна... помните, что наибольшее количество, которое вы можете сохранить в N байтах, равно 2 ^ (N) - 1... не 2 ^ (N). Есть 2 ^ N возможных номеров, однако наибольшее количество, которое вы можете сохранить, на 1 меньше.

Если Facebook использует неподписанный большой int, вы должны это использовать. Вероятно, они не назначают их последовательно.

Да, вы могли бы уйти с varchar... однако это было бы медленнее (но, вероятно, не так сильно, как вы думаете).

Ответ 6

Сохраните их как строки.

API-интерфейс Facebook возвращает идентификаторы как строки, поэтому, если вы хотите, чтобы сравнения работали без использования, вы должны использовать строки. ИМО это превосходит другие соображения.

Ответ 7

Я бы просто придерживался INT. Это легко, оно мало, оно работает, и вы всегда можете изменить колонку на больший размер в будущем, если вам нужно.

FYI:

VARCHAR(n) ==> variable, up to n + 1 bytes
CHAR(n) ==> fixed, n bytes

Ответ 8

Если вы не ожидаете, что более 60% населения мира будет зарегистрировано, int должен делать?