2009-09-03 3 views
1

Я пытаюсь исправить проект, который кто-то еще закодировал, это беспорядок!Лучший способ сохранить короткий номер в mysql

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

Они использовали массив для многих полей профиля, он сохранил бы возможные ответы. Пользователь может выбрать только 1 ответ, хотя в этом случае. Таким образом, для образования есть 7 возможных ответов, а число, соответствующее его числу в массиве, хранится в DB mysql, они сохраняют этот 1 номер как длину varchar 255, которая не может быть хорошей.

Должен ли я хранить его как varchar с длиной 1 или использовать перечисление и список 7 вариантов или что-то еще?

Образование

<?PHP 
// Array of possible education profile selections 
$arr_education[1]="No Answer"; 
$arr_education[2]="High school"; 
$arr_education[3]="Some college"; 
$arr_education[4]="In college"; 
$arr_education[5]="College graduate"; 
$arr_education[6]="Grad/professional school"; 
$arr_education[7]="Post grad"; 

// shows the array above as checkboxes on a form 
foreach($arr_education as $ind=>$val) { 
    echo '<input type="radio" name="education" value="' .$ind. '" ' if($education==$ind){ echo "checked";}. '>' .$val. '<br>'; 
} 



//on a users profile page there would be something like this 
$education = 7; // seven would be Post Grad from our array above 
echo $arr_education[$education] 

//Now here is the mysql table, they chose to use a varchar(255) which seems retarded, using the above code, the max result would be 1 charachter long 
education varchar(255) 

?> 
+0

Это varchar с длиной MAX 255. Это не лучший способ сохранить число, но если требуется меньшая длина, используется меньше. – pavium

+0

@pavium: Когда MySQL создает временные таблицы в памяти (например, при сортировке набора результатов), он будет выделять полные 255 байт для каждой строки, как если бы это столбец CHAR. –

ответ

3

Если бы это был новый проект, я бы рекомендовал использовать ENUM. Это пространство эффективно (оно фактически хранится на 1 байт) и прост в использовании. Однако, если вам нужно поддерживать устаревший код, я бы рекомендовал придерживаться необработанных чисел и изменить этот столбец на TINYINT.

Кроме того, я бы рекомендовал заменить номера в исходном коде PHP на константы, чтобы вам не приходилось гадать, что делает код. Например:

define('EDU_NO_ANSWER', 0); 
define('EDU_HIGH_SCHOOL', 1); 
define('EDU_SOME_COLLEGE', 2); 
// etc... 

if ($education >= EDU_SOME_COLLEGE) 
{ 
    // student went to college, but you didn't need that 
    // comment to know that 
} 
1

Для этого, VARCHAR (1) будет занимать ровно столько места, как VARCHAR (255), за исключением, если перечисление не достигал двузначных цифр, а VARCHAR (1) сломает. Поле varchar, которое равно < = 255 max chars хранит 1 байт для длины строки, а затем строку. Итак, для одноразрядного числа varchar (255) занимает 2 байта.

Почему они не использовали один из целых классов, однако, вне меня.

3

Почему бы не использовать TINY INT? Это соответствует вашим потребностям, если ответы будут < 255 :) Мои тесты показывают, что он быстрее, чем varchrars при индексировании и выборе.

0

Если бы это был я, я бы создал отдельную таблицу с профилями в ней, а затем заполнил тег Select тегами SQL-запроса. Сделайте индекс целым (в конце концов, вы никогда не знаете, чем это будет расти ..) Это также позволило бы enduser изменить описания, не касаясь кода (при условии, что у них есть SQL-доступ)

1

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

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