2015-10-15 2 views
2

Я сохраню статус от 0 до 7, и я хочу знать, какое из лучших полей типа хранить, учитывая производительность и пространство в базе данных Postgres: varchar (1) или smallint.Тип работы varchar (1) или smallint для сохранения статуса Postgres

Кстати, существует ли какая-либо разница для установки поля varchar (1) или varchar (100), все еще говорящего о производительности и пространстве?

+1

Мы говорим о таблице с одним столбцом и одной строкой для хранения целочисленного значения в диапазоне [0,7]? – moooeeeep

+0

Если вы беспокоитесь о влиянии одного символа на пространство на складе, вы можете путешествовать во времени с 1960-х годов. –

+0

@NevilleK - мы тоже беспокоились об этом в 1970-х годах ... :-) –

ответ

0

Хотя я согласен с Бобом Джарвисом в том, что это действительно преждевременная оптимизация, я постараюсь сосредоточиться на вопросе, как было задано.

Вы пренебрегаете самыми важными выборами. Ваши варианты включают:

  • smallint
  • enum
  • "char"
  • character и character varying

Вы можете использовать перечисляемого типа. Это действительно нормально, если вы не хотите удалять допустимые значения, поскольку PostgreSQL в настоящее время не поддерживает удаление значений из типов перечислений.

В качестве альтернативы вы можете использовать тип данных "char". Да, цитаты имеют значение. Это один символ, например, тип данных C char. Без котировок char превращается в character(1) во время разбора.

varchar и character не очень подходит для этого, потому что они переменная ширины типов с заголовочными накладными расходами и т.д.

Кстати, есть ли разница, чтобы установить поле varchar(1) или varchar(100), по-прежнему говорить о производительности и пространстве?

№ Это ответ (много раз) в других вопросах.

6

По-моему, вы сражаетесь с неправильным боем. Вы беспокоитесь о влиянии производительности на хранение целого числа вместо одного символьного поля, которое, на мой взгляд, является близоруким мышлением. Фактическое влияние на производительность целого числа на один символ тривиально, и я сомневаюсь, что это можно измерить осмысленно. По моему опыту, более важно уменьшить когнитивную нагрузку на разработчиков и пользователей системы, и поэтому лучше использовать символьные поля, которые достаточно длинны, чтобы содержать разумное описание статуса вместо числовых значений или аббревиатур одного символа. Не нужно помнить, что означают 1, 2, «A» или «X». Вместо этих сокращенных значений я предлагаю использовать понятные для понимания значения, такие как «READY», «ACTIVE», «PROCESSED», «CANCELED» и т. Д.

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

Удачи.

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