Все опреднляется размером хранимых данных и удобностью и использования. Например размер можно оставить и как char3 и как varchar3. При условии что более символов не добавляется. Этообуславливается тем, что расположение отдельной таблицы для значения поля размер и хранение индекса в этой конкретной таблице преввшает ражмер и скорость указанных типов.
С цветом довольно непонятная ситуация. Дело в том, что стандартное представление цвета - это 4 байта данных. Значит обычного значения integer для него достаточно. Если же имеется ввиду, что цвет будет храниться в виде символьного значения (например red, green, blue, magenta .. и т д), то удобнее строить отдельную таблицу для цвета, хранить в таблице инбес на него и в запросе джойнить обе таблицы.
С принтом вроде бы однозначно нужно ттдельную таблицу и индекс.
С имиджами такая штука: если для разных записей в этой таблице используются разные (неповторяющиеся) значения, то тогда конструируется поле типа varchar на максимальную длинну допустимых значений. Если все таки имеет место повторение, то конструируется отдельная таблица и индекс.