2015-07-27 1 views
0

Мы храним данные о винной базе данных в нашей базе данных. Винтаж вина может быть номером или строка, такая как Non-Vintage.Лучший способ хранения поля базы данных, которое потенциально может быть числом или строкой

2010 означает, что виноград были собраны в 2010 году

невинтажных означает, что виноград собирают по неизвестному периоду времени.

Сначала мы решили сохранить это поле как строку, так как 2010 и Non-Vintage являются потенциально строковыми. Однако нам нужно иметь возможность сортировать годы или выполнять некоторую арифметику (т. Е. Год> 2010).

Мы рассматриваем как:

  • Хранить данные, как номер и «Non-Vintage» будет назначены 0. Однако, мы должны были бы обеспечить странные валидации везде в приложении для обработки 0 стоимость.
  • Сохраните год как номер и укажите логическое поле «non_vintage» для не-марочных вин.

Данные, вытащенные из базы данных, будут доставлены на front-end AngularJS через API. Код Javascript должен будет анализировать и использовать год в разных точках ... т. Е. «Показать мне все вина, где год> 2010».

У кого-нибудь есть мысли, по которым лучше и почему?

+0

Когда вы говорите (выполняете какую-либо арифметику), вы приводите пример сравнительного оператора ... реальный вопрос: делаете ли вы какую-либо РЕАЛЬНУЮ арифметику? (т.е. +, -, *,/или хуже: дата "математика")? – Ditto

+0

@ Ditto обновил мой вопрос с более подходящей информацией. И не сумасшедшая математика ... просто какое-то сравнение вроде «в этом году больше, чем в этом году» –

ответ

0

Вы используете mysql? вы можете передавать строки как int в своих операциях mysql.

select * from table order by cast(string AS signed) asc; 

Это будет означать, что вы можете хранить как строку.

+0

Это довольно круто; не знал этого. Я использую MySQL. Тем не менее, я отправляю данные, которые будут потребляться клиентом JS. И JS-код не полюбит получение 'year: '2010' 'и' year: "NV" ' –

0

Вариант 1

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

Это имеет некоторые преимущества и disads сразу же:

Преимущество:

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

Неудобство:

  • потенциально позволяет значения, которые вы не хотите/ожидание/и т.д.. : т. Е. «NonVintage», «Non-vantage», «Неизвестный», «Человек-паук!» ... О.о

Это может быть смягчено любой ваш процесс для ввода значения может быть (то есть, если это в основном автоматизирован, это могло бы быть меньше, вопрос) :)

========= ===============================

Вариант 2

более строже способом было бы используйте 2 столбца. Число и строка.

Сохраните год урожая в поле с 4-значным номером, и вы знаете, что он всегда будет «правильным» годом. (вы можете добавить контрольное ограничение для предотвращения лет < 1000, если хотите;))

Сохраните код «NV» в колонке «код» цифры в 2 (или 3 ×). Это дает вам хорошую гибкость в будущем, если другие требования в будущем начнут запрашивать дополнительные типы или такие.

Вы могли бы просто сделать логическое - это сработало бы, однако, если в будущем все изменится (они всегда это делают), вам придется перепроектировать .. колонка с кодом строки не имеет реальной жесткой дислокации в булевом языке и дает вы просто гибкость идти вперед;)

========================

Это будет зависеть от вашей системы и то, что вы знаете это и как поступают данные ... но я, вероятно, склоняюсь к варианту 2 (номер + строка).

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