Основной вопрос SQL - выбор типа данных - PullRequest
1 голос
/ 16 февраля 2009

В настоящее время я создаю небольшую таблицу в Oracle и не уверен, какой тип данных выбрать для определенного столбца.

Столбец помечен как «остаться», и я хотел бы, чтобы он содержал только эти значения «Короткий», «Средний» и «Длинный». Конечная цель - поместить эти значения в раскрывающийся список в форме.

Прав ли я при выборе типа данных 'char (6)' здесь?

Можно ли тогда использовать построитель форм Oracle, чтобы превратить это в список значений?

Спасибо за ваше время.

Ответы [ 6 ]

4 голосов
/ 16 февраля 2009

Прежде всего, я бы назвал столбец «StayDuration» или «StayLength», поскольку само по себе «Stay» все еще немного сбивает с толку. Как только это будет сделано, я вижу два приемлемых подхода:

  • Поместите ваши длины в отдельную таблицу, и ваш существующий столбец сохранит внешний ключ в этой таблице.
  • Сохраните целое число, так что значение целого числа может быть легко расширено до фактических значений для барьеров длины пребывания с помощью простой формулы. (Пример: «короткое» пребывание может составлять 1 день или менее, «среднее» - одна неделя или менее, а затем все остальное будет длинным, вы можете использовать 0, 1 и 7 для целых чисел.

Я стараюсь не хранить данные типа varchar прямо здесь. Он требует больше памяти и позволяет легко получить неверно введенные или устаревшие данные.

Возможен также гибридный подход, так что «ключи» из новой таблицы в первой опции отображаются в целочисленные значения, предложенные во 2-й.

2 голосов
/ 16 февраля 2009

Используйте VARCHAR2 (6). CHAR (6) имеет семантику с пробелами, что странно использовать; это также означает, что вы сохраняете целые 6 символов для слова «Long» каждый раз, когда используете его. Почти никогда нет веской причины использовать CHAR вместо VARCHAR2.

2 голосов
/ 16 февраля 2009

Есть в основном 3 варианта:

  • Некоторые базы данных поддерживают тип Enum специально для этих ситуаций. (не уверен насчет Oracle)
  • Вы можете использовать символ (6)
  • Вы можете использовать int и сопоставить их на уровне приложения с соответствующим типом.

Я бы сказал, что Enum - самый «чистый» вариант. Но некоторые ORM не поддерживают это должным образом.

Этот ТАК вопрос может быть вам интересен:

Как использовать перечисления в Oracle?

1 голос
/ 16 февраля 2009

Если есть доступный тип ENUM, переходите к этому. В противном случае я предлагаю два варианта:

  • Сохраните его как один байт (или наименьший доступный целочисленный тип). Затем вы можете конвертировать в и из перечисления в вашем приложении по желанию. Я думаю, что это самый чистый подход и довольно хорошо связывается с ComboBox es как пара ключ-значение.

  • Вы также можете хранить строки в отдельной таблице и использовать существующий столбец как внешний ключ для этой новой таблицы. Тогда легко присоединиться к этой таблице и получить быстрый поиск строки для отображения в вашей форме. Однако это приводит к дополнительным накладным расходам и, возможно, помещает ваши строки в два местоположения - ваше приложение и база данных. Более того, если вы когда-нибудь захотите локализоваться, вас ждет настоящая стычка.


Я не могу рекомендовать использовать параметр string (VARCHAR / CHAR), если вы хотите построить логику приложения вокруг этого столбца. Вы будете зависать, сравнивая строки весь день, что, на мой взгляд, довольно уродливо и медленно. Они также медленнее сортируют и запрашивают, чем простой целочисленный тип. (Однако в вашем примере вы безопасны , потому что вы можете просто сравнить первый символ 'S', 'M' или 'L' - один байт. Но вам придется специально проинструктировать его сортировать и запрашивать таким образом.)

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

  • 1 000 000 строк CHAR (6) на 5 000 000 байтов больше, чем при использовании одного байта.
  • Использование VARCHAR (6) даст среднюю длину 5 = 4 000 000 байтов дополнительно для 1 000 000 строк.
0 голосов
/ 16 февраля 2009

Использование числового типа данных значительно упрощает сортировку по размеру, если вы когда-нибудь захотите это сделать. Я не могу говорить за Oracle, но много раз, использование одного байта не спасет вас много, так как в любом случае оно будет помещено в 4-байтовое слово.

Кроме того, у вас есть только три размера сейчас, но в будущем у вас их может быть намного больше. Использование одного символа может сделать различие между размерами XL и XXL настоящим испытанием.

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

0 голосов
/ 16 февраля 2009

Используйте CHAR (1) со значениями 'S', 'M', 'L'; опционально свяжите столбец со второй таблицей, где S / M / L - первичные ключи, а "small / medium / long" - объяснения varchar (255). Таким образом, вы получите оптимальный размер кода (1 байт как можно короче), но при этом сможете печатать «хорошие» имена в отчете.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...