Должен ли я представлять данные базы данных с неизменяемыми или изменяемыми структурами данных?

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

Когда я извлекаю данные из своей базы данных, я сопоставляю их с модельной структурой данных. В функциональном программировании структуры данных имеют тенденцию быть неизменными. Но данные в базе данных изменяемы, поэтому я задаюсь вопросом, должна ли моя модель быть изменчивой. В целом, что было бы хорошей и хорошо принятой практикой в ​​таком случае?

После Scala курсов Мартина Одерского на Coursera, я помню, он сказал что-то вроде:

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

Итак, еще раз, интересно, что мне делать. На данный момент мои структуры данных неизменяемы, и это приводит к большому числу шаблонов кода, когда я хочу обновить запись в моей базе данных. Будет ли использование изменчивой модели помочь уменьшить эту плиту котла?

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

Ответ 1

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

В то время как обычно более здорово уволить мусор, как это, вам может быть интересно беглый развенчание: http://blog.higher-order.com/blog/2012/09/13/what-purity-is-and-isnt/

Однако я настоятельно рекомендую уволить его и продолжить.

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

http://dropbox.tmorris.net/media/doc/lenses.pdf

Надеюсь, что это поможет.

Ответ 2

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

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

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

Ответ 3

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

Наш опыт в том, что это значительно упростило то, как мы работаем с моделью, в том числе настойчивость.

Я пока не понимаю, почему все стало проще, просто так. Мне нужно обдумать это больше. Рассуждение о коде и работа с ним проще.

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