Лучший способ сохранить только день и месяц в базе данных

Монополия - это дьявол, а синглтоны с нечитаемым / изменяемым состоянием - это «настоящая» проблема ...

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

Глобально это плохо, потому что:

  • а. Это вызывает конфликт пространства имен
  • b. Это разоблачает состояние необоснованным образом

Когда дело доходит до синглетонов

  • a. Явный ОО способ их вызова предотвращает конфликты, поэтому укажите а. не является проблемой
  • b. Синглтоны без состояния (как фабрики) не являются проблемой. Синглтоны с состоянием могут снова попасть в две категории, которые являются неизменяемыми или пишутся один раз и читают много (файлы конфигурации / свойств). Это не плохо. Вы можете говорить об изменчивых синглетонах, которые являются своего рода держателями ссылок.

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

Как это относится к монополии?

Чтобы начать игру в монополию, сначала:

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

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

1120 Итак, вы играете в монополию с друзьями Бобом, Джо и Эдом. Вы быстро строите свою империю и занимаете долю рынка по экспоненте. Ваши противники слабеют, и вы начинаете чувствовать запах крови (в переносном смысле). Ваш приятель Боб вложил все свои деньги в блокировку как можно большего количества недорогих объектов, но он не получает высокую отдачу от инвестиций, как он ожидал. Боб, как удар неудачи, приземляется на тротуаре и исключается из игры.

Теперь игра переходит от дружелюбной игры в кости к серьезному бизнесу. Боб стал примером неудачи, а Джо и Эд не хотят в конечном итоге стать «тем парнем». Итак, будучи ведущим игроком, вы внезапно становитесь врагом. Джо и Эд начинают практиковать сделки «за столом», денежные вливания за спиной, недооцененный обмен домами и вообще все, что может ослабить вас как игрока, пока один из них не поднимется на вершину.

Затем, вместо того, чтобы выиграть один из них, процесс начинается заново. Внезапно, конечный набор правил становится движущейся целью, и игра вырождается в тип социальных взаимодействий, которые составляли бы основу каждого высококлассного реалити-шоу со времен Survivor. Почему, потому что правила меняются, и нет единого мнения о том, как / почему / что они должны представлять, и что более важно, нет ни одного человека, принимающего решения. Каждый игрок в игре, в этот момент, устанавливает свои собственные правила, и за этим следует хаос, пока два игрока не слишком устают, чтобы поддерживать шараду и медленно сдаваться.

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

Как это относится к программированию?

Помимо всех очевидных проблем с безопасностью потоков и синхронизацией, которые возникают с изменяемыми синглетонами ... Если у вас есть один набор данные, которые могут быть прочитаны / обработаны несколькими различными источниками одновременно и существуют в течение всего времени выполнения приложения, Вероятно, сейчас самое время сделать шаг назад и спросить: «Использую ли я здесь правильный тип структуры данных».

Лично я видел, как программист злоупотребляет синглтоном, используя его в качестве своего рода скрученного хранилища базы данных в приложении. Работая непосредственно с кодом, я могу засвидетельствовать, что он был медленным (из-за всех блокировок потоков, необходимых для обеспечения его потоковой безопасности) и кошмаром для работы (из-за непредсказуемой / прерывистой природы ошибок синхронизации), и почти невозможно проверить в условиях «производства». Конечно, система могла бы быть разработана с использованием опроса / сигнализации, чтобы преодолеть некоторые проблемы с производительностью, но это не решило бы проблемы с тестированием и зачем беспокоиться, когда «настоящая» база данных уже может выполнять те же функции в гораздо более надежной среде. / масштабируемым образом.

Опция Singleton - это только , опция, если вам нужно то, что обеспечивает синглтон. Доступный только для чтения экземпляр объекта. Это же правило должно касаться и свойств / элементов объекта.

10
задан Raffael Luthiger 25 June 2009 в 10:47
поделиться

7 ответов

Я бы выбрал б), потому что он более точно отражает смысл данных. Наличие структуры данных, в которой некоторые части предполагается «игнорировать», проблематично. Что, если люди просто проводят простое сравнение дат, предполагая, что год всегда один и тот же, но кто-то использовал другой год-заполнитель, предполагая, что год в любом случае не имеет значения?

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

То, что в) плохо, я считаю, вне разумного обсуждения :-). И я не думаю о причинах производительности ...

10
ответ дан 3 December 2019 в 22:38
поделиться

Я бы выбрал число дня года (например, одно число от 0 до 365, а затем добавило бы его к 1 января конкретного года, который вас интересует.

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

Помните, вы приходится иметь дело с високосными годами, поэтому использование поля даты - плохая идея, поскольку вам придется хранить даты с двумя годами - один високосный год, а другой нет - очень сложно!

0
ответ дан 3 December 2019 в 22:38
поделиться

Я бы использовал поле даты и, хотя он и не нужен, все равно сохранил бы год. Просто удалите его, когда вам нужно его распечатать / использовать. На это есть несколько причин:

  1. Вы можете узнать, что позже указать, что покупатель действительно хочет, чтобы вы сохраните дату. В таком случае вы не нужно вносить никаких изменений в ваш структура базы данных.
  2. Вы можете использовать функции даты SQL для сравнения дат, если это необходимо. Если у вас есть день и месяц в отдельных полях, вам понадобится намного больше кода, например, для вычисления разницы между двумя датами (високосные годы и т. Д.).

Причины выбора b) также могут быть легко решены с помощью этих функций даты SQL . Вы можете легко выбрать события определенного месяца, например, в одном запросе.

2
ответ дан 3 December 2019 в 22:38
поделиться

Я бы выбрал b), потому что это значительно упростит запросы: вы сможете очень легко восстановить все события в диапазоне (декабрь, определенный день, диапазон дней). Если вы выберете а) - не забудьте установить конкретный год для сравнения и извлечения данных.

1
ответ дан 3 December 2019 в 22:38
поделиться

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

 first_event | interval | interval_unit
-------------+--------------------------
  2009-01-01 |        6 | 'month'
  2009-02-01 |        1 | 'year'

К сожалению, MySQL не имеет типа данных INTERVAL , поэтому потребуются два столбца и небольшая пост-обработка, но я думаю, что это наиболее гибкий подход к проблеме.

1
ответ дан 3 December 2019 в 22:38
поделиться

Выберите ОДНО поле типа int, например 1601, для 1 января.

0
ответ дан 3 December 2019 в 22:38
поделиться

Я бы тоже поддержал вариант b), но использовал TINYINT для месяца (от 0 до 255) и SMALLINT (от -32,768 до 32,767) для года, чтобы сэкономить немного места.

0
ответ дан 3 December 2019 в 22:38
поделиться
Другие вопросы по тегам:

Похожие вопросы: