Задать вопрос

Типы полей в MySQL?

Какие типы будут идеологически правильными для каждого из полей и почему? Базы данных начал вот только изучать, поэтому вопрос ламерский, но нужный в дальнейшем. Поля:
  • user_id
  • user_name
  • user_pass
  • user_invite
  • user_reg_flag
  • user_mail
  • user_course
  • Вопрос задан
  • 8054 просмотра
Подписаться 6 Оценить 2 комментария
Решения вопроса 1
L0NGMAN
@L0NGMAN
CREATE TABLE `users` (
`user_id` int(10) unsigned NOT NULL AUTO_INCREMENT,
`user_name` char(50) NOT NULL DEFAULT '',
`user_pass` char(32) NOT NULL DEFAULT '',
`user_mail` char(50) NOT NULL DEFAULT '',
`user_invite` tinyint(1) NOT NULL DEFAULT 0,
`user_created` TIMESTAMP DEFAULT '0000-00-00 00:00:00' NOT NULL,
`user_updated` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
PRIMARY KEY (`user_id`),
UNIQUE KEY (`user_name`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8;
Ответ написан
Пригласить эксперта
Ответы на вопрос 7
Под name использовать 25 в случае utf-8 имхо не самая лучшая идея, даже если ограничиться русским, на мыло 50 тоже может не хватить в извращенных случаях, но соответствующих rfc (домены.рф например :) ). Да и вообще никакого оверхеда между varchar(1) и varchar(256) нет, смысла экономить не вижу, если в требованиях есть ограничения, то проверять их в приложении и именно на количество символов, а не байт (для php — mb_strlen(), а не strlen() ).
Ответ написан
@niko83
CREATE TABLE `users` (
`id` int(10) unsigned NOT NULL AUTO_INCREMENT,
`name` varchar(25) NOT NULL DEFAULT '',
`pass` varchar(32) NOT NULL DEFAULT '',
`mail` varchar(50) NOT NULL DEFAULT '',
`invite` tinyint(1) NOT NULL DEFAULT 0,
`created` TIMESTAMP DEFAULT '0000-00-00 00:00:00' NOT NULL,
`updated` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
PRIMARY KEY (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8;
Ответ написан
Комментировать
Chvanikoff
@Chvanikoff
Вообще, если сразу думать о хорошей архитектуре, то это не одна таблица должна быть.

Таблица1: ид, логин, пароль
Таблица2: данные о пользователе
Значение поля инвайт я не понял, но если имеется в виду «реферральная программа», или ее подобие — тоже отдельная таблица с данными «ид пользователя», «реферрер»
и вместо user_reg_flag сделать таблицу ролей пользователя в системе (у вас же еще, скорее всего, администратор будет?) — для начала «login» и «admin» и связать через связывающую таблицу пользователей с ролями, чтобы каждый мог иметь несколько. Тогда при подтверждении регистрации, например, добавляем юзеру роль«login», если хотим забанить (запретить вход) — убираем ее.

Если интересно — могу написать структуру этих таблиц.

ЗЫ: что касается собственно сабжа — не вижу смысла в оптимизации полей без оптимизации структуры БД.
Ответ написан
SwampRunner
@SwampRunner
id — int 10 unsigned
name — varchar 25
pass — varchar 32 (после md5)
email — varchar 50

если нужен bool, то tinyint 1
Ответ написан
Комментировать
DeusModus
@DeusModus
В sqlyog есть замечательный анализатор таблиц. Создаете таблицу бездумно, наполняете ее данные, затем анализируйте и sqlyog предлагает вам оптимальные типы полей. От необходимости разбираться с СУБД не избавит, но может краткосрочно решить вашу проблему.
Ответ написан
charon
@charon
в общем случае: использовать фиксированный формат (char вместо varchar) минимально необходимой длины. Также можно учесть особенности архитектуры (32 -битный сервер: айди — целое беззнаковое размером 32 бита).
Ответ написан
Комментировать
@mitnlag
Я бы сказал, что хабр — не место для решения домашних задачек.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы