2013-07-15 2 views
1

Я часто использую (что я называю) «флаг» столбцы в моей БД, например, следующее:Столбцы флага, Varchar или INT?

Column 'Type': 
0 = CREATOR 
1 = OPERATIVE 
2 = APPROVER 

Но это правильный способ сделать это? Я только спрашиваю, потому что это может сбивать с толку, возвращаясь к нему позже, когда я не помню, что означает нуль, один, два или три. Не было бы лучше просто отметить их как CREATOR и т. Д.?

Какова общепринятая практика для этого?

+0

Рассмотрите возможность принятия нижеследующего ответа. – Kermit

ответ

5

Флаг обычно представляет собой логическое true и false или 0 и 1 выражается в bit (MySQL 5.0.3+), или tinyint. Если у вас более двух возможных значений, эти значения могут быть сохранены в ENUM в MySQL, в противном случае эти возможные значения должны храниться в их собственной таблице и ссылаться на отношения внешних ключей (нормализация).

0

Его лучше использовать int/tinyint. И всегда используйте comments, который поможет вам запомнить все значения.

Числовые значения лучше в коротком замыкании и сравнении.

Enum может быть вариантом. Но общая проблема с значениями перечисления - это если ваши флаги увеличиваются, тогда их немного сложно управлять.

1

ИНТЕГЕРЫ предпочитают STRING с точки зрения индексации.

Но у вас может быть другая таблица, в которой хранятся только roles с INT role_id primary key и UNIQUE VARCHAR role column. И затем, в вашем user_roles, укажите user_id и role_id как FOREIGN KEY, указывая на roles`.`role_id.

  • Таким образом, роль остается INT, но может быть JOINED к roles столу, чтобы получить его имя.
  • И когда вам нужно использовать литерал role, вы запрашиваете role_id из таблицы roles.

Это нормализация.

PS: Но это может быть перебор в зависимости от вашей базы пользователей. Узнать больше об indexed VARCHAR role columns.

+0

создание другой таблицы? Просто глупо создавать другую таблицу, чтобы помнить, что такое ценность, когда PHP будет инстинктивно знать. – Chud37

+2

@ Chud37 Это позволяет вам масштабировать без значений hardcoding в вашем скрипте. Это не глупо ... для больших сайтов. – CodeAngry

+2

@ Chud37 * "инстинктивно" *? С каких пор PHP-код имеет инстинкты? –

0

Не использовать VARCHAR. УАКСНАК эффективен только для строк над размером 3.

Varchar Mysql Reference

В этом случае можно использовать CHAR (1) и использовать значение C, O, и A в качестве щекотливого.

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

function isCreator($value) { 
    if($value === 0) return true; 
} 

Хороший вопрос.

1

Ответ на ваш вопрос может быть «перечислены типы», которые описаны here. Они позволяют связать строку с числовым значением как тип в MySQL - обычную практику в «реальных» языках программирования.

Часто, однако, вы не хотите этого делать, потому что вам нужна справочная таблица для объекта. Как правило, имя является «сущностью» в реляционных терминах. Это наводит на мысль, имеющий таблицу:

create table OperatorType (
    OperatorTypeId int auto_increment primary key, 
    Name varchar(255) 
) 

В этом случае, все ссылки будут на идентификатор в таблице, которая была бы целым числом.

Использование идентификатора без перечислимого типа или справочной таблицы должно быть обескуражено. Предположительно, цель name состоит в том, чтобы иметь доступный для пользователя вывод. Вы не хотите, чтобы разные запросы (и авторы запросов) придумывали собственные имена для типов операторов. Вместо этого используйте встроенные механизмы базы данных для правильной обработки этой ситуации.

+1

Рассмотрите возможность добавления уникального ключа (Name) '. – CodeAngry

0

Я всегда использую tinyint. Он занимает меньше места, чем varchar, и намного лучше для скорости и индексации. Я знаю многих, кто использует enum, и хотя мне нравится идея, я предпочитаю гибкость tinyint. Комментарии поля также являются отличным инструментом, который может быть очень полезен в будущем.

За исключением случаев, когда я знаю, что я храню двоичное значение yes/no. Я всегда использую значения выше нуля. Это может сэкономить много путаницы в долгосрочной перспективе, так как PHP оценивает ноль и false тождественно (большая забота о том, чтобы вы собирали значение из веб-формы).

0

Да, вы можете использовать INT, как тип данных для столбца «типа» Что касается вашего беспокойства о забывая позже, в конечном счете, что 0,1,2 repersents вы всегда можете предоставить описание в столбце таблицы комментарии

вы измените поле и добавить комментарий к нему, выполнив следующий запрос альтер:

ALTER TABLE `table_name` CHANGE `Type` `Type` INT(2) NOT NULL DEFAULT '0' COMMENT '0 is CREATOR, 1 is OPERATIVE,2 is APPROVER' 

Я надеюсь, что это может быть какой-то помощи.

+0

** 'INT (2)' не влияет на размер, а только форматирование:) ** 'TINYINT' - это небольшой тип данных, который вы ищете aka' char' в 'C'. Это 'TINYINT',' SMALLINT', 'MEDIUMINT',' INT', 'BIGINT'. – CodeAngry

+0

да, но я верю, что здесь задан вопрос о том, как он сможет вспомнить, что то, что обозначено цифрой 0,1,2 в конечном итоге, поэтому запрос на добавление комментария в поле таблицы, как и для использования INT (2), состоял в том, чтобы показать альтернативный запрос для добавления комментария и курса, если он хочет изменить INT на TINYINT, чтобы изменить размер, который также является хорошим подходом. –

0

попробовать это один

make your type column a enum field and set the value like '0','1','2' 

и в поле комментария записи как 0 = СОЗДАТЕЛЬ, 1 = ОПЕРАТИВНОЙ, 2 = APPROVER.It поможет вам запомнить значения, когда вы будете смотреть на вашей базе данных а год после.

+1

Почему? Точка 'enum' заключается в том, что вы можете присвоить имена именам для разных допустимых значений. Приведение числовых имен строк в перечисления действительно плохое, если вы иногда передаете его как число и иначе как строку. См. Http://dev.mysql.com/doc/refman/5.6/en/enum.html. –

0

VARCHAR Худший тип для использования в этом сценарии, так как другие упомянутые Вы можете рассмотреть ENUM, INT или таблицу отношений с ролями.

Различия:

При использовании ENUM для вставки записей можно использовать литералы и номер в качестве значений. При повторном выборе Вы можете использовать как литералы, так и цифры в WHERE, но возвращаемые значения будут строками, если вы хотите получить номера. Вы должны выбрать columnsname+0 в списке полей.

При использовании INT Вы можете использовать только цифры.

Похоже, что ENUM должно быть лучше плюс, если вы создадите некоторые статические константы для хранения числовых значений в вашем коде, все станет проще.

Теперь отношение лучше, чем ENUM?

Если вам требуется гибкость и вы хотите добавить новые роли из таблицы отношений PA, это единственное решение, которое вы должны рассмотреть.

Если ваши роли постоянны и никогда не будут меняться, то ENUM лучше, без необходимости участия в JOIN.

Смежные вопросы