Должен ли я представлять данные базы данных с помощью неизменяемых или изменяемых структур данных?
В настоящее время я занимаюсь программированием на Scala, но, думаю, это применимо к любому функциональному языку программирования, точнее, к любому языку программирования, который рекомендует неизменность и может взаимодействовать с базой данных.
Когда я выбираю данные из моей базы данных, я сопоставляю их с модельной структурой данных. В функциональном программировании структуры данных имеют тенденцию быть неизменными. Но данные в базе данных являются изменчивыми, поэтому мне интересно, должна ли моя модель быть изменчивой. Вообще, что было бы хорошей и общепринятой практикой в таком случае?
После курсов Scala Мартина Одерского на Coursera, я помню, он сказал что-то вроде:
Лучше использовать неизменные структуры данных, но когда вы хотите взаимодействовать с реальным миром, может быть полезно использовать изменяемые структуры данных.
Итак, опять же, мне интересно, что мне делать. На данный момент мои структуры данных неизменны, и это приводит к большому количеству шаблонного кода, когда я хочу обновить запись в моей базе данных. Поможет ли использование изменяемой модели уменьшить этот котел?
(Я уже задавал подобный вопрос, который был довольно специфичен для технологий, которые я использую, но я не был удовлетворен фактическими ответами, поэтому я обобщил его здесь.)
3 ответа
"Взаимодействие с реальным миром" не имеет ничего общего с тем, используете ли вы изменяемые или неизменяемые структуры данных. Это меха, который повторяется слишком часто, и это здорово, что вы его подвергли сомнению.
Хотя обычно избавляться от мусора, как это, обычно более полезно, вас может заинтересовать краткий разбой: http://blog.higher-order.com/blog/2012/09/13/what-purity-is-and-isnt/
Тем не менее, я настоятельно рекомендую отказаться от этого и двигаться дальше.
На ваш вопрос вы говорите, что у вас есть шаблон, когда вы хотите выполнять операции с вашими неизменяемыми структурами данных. На самом деле, существует очень хорошо обоснованная теория, которая в значительной степени решает эту проблему. Вот статья, написанная об этом с использованием Scala:
http://dropbox.tmorris.net/media/doc/lenses.pdf
Надеюсь, это поможет.
Почему база данных изменчива? Является ли фундаментальная природа баз данных быть изменчивой? Реляционная модель и использование ее в качестве хранилища для данных вашего приложения могут привести вас к такому выводу, но это не может быть фундаментальным свойством.
Учитывая, что у вас могут быть другие варианты, такие как сохранение новой версии ваших данных при обновлении, возможно, предпосылка вопроса несколько подорвана. Возможно, даже если у вас есть изменяемая база данных, вам все равно нужно предоставить новое значение для функции обновления, которое отделено от старого значения - рассмотрим, например, оптимистическую блокировку, при которой обновление должно происходить только в том случае, если старое значение имеет пока что не изменилось.
Другими словами, изменчивость или иная база данных вообще не должна иметь значения, вы имеете дело с отдельным уровнем домена в вашем приложении. Если вам нужно спросить, то ответ всегда будет неизменным. Изменчивость является вектором сложности, который эксперты должны вводить в качестве оптимизации производительности только тогда, когда это было доказано необходимым.
В приложении для трейдинга, над которым я сейчас работаю, почти все неизменное - конечно, модель.
Наш опыт показывает, что это значительно упростило нашу работу с моделью, включая постоянство.
Я пока не понимаю, почему все стало проще, просто так. Мне нужно больше обдумать это. Рассуждать о коде и работать с ним проще.
Да, вам нужно использовать такие вещи, как линзы, но я склонен писать их - механический процесс - и двигаться дальше. Это крошечная часть, которую, я уверен, можно уловить.