我应该使用不可变或可变数据结构表示数据库数据吗?

Seb*_*ber 12 database language-agnostic functional-programming immutability

我目前正在用Scala编程,但我想这适用于任何函数式编程语言,或者更确切地说,任何编程语言都推荐不变性并且可以与数据库交互.

当我从数据库中获取数据时,我将其映射到模型数据结构.在函数式编程中,数据结构往往是不可变的.但是数据库中的数据是可变的,所以我想知道我的模型是否也应该是可变的.一般来说,在这种情况下,什么是好的和广为接受的做法?

按照Martin Odersky在Coursera上的Scala课程,我记得他说过:

最好使用不可变数据结构,但是当你想与现实世界交互时,使用可变数据结构会很有用.

所以,我再次想知道该怎么做.截至目前,我的数据结构是不可变的,当我想更新数据库中的记录时,这会导致很多样板代码.使用可变模型有助于减少这种锅炉板吗?

(我已经问了一个类似于我使用的技术的类似问题,但我对实际答案并不满意,所以我在这里概括了一下.)

Jed*_*ith 6

为什么数据库可变?数据库的基本特性是可变的吗?关系模型并将其用作应用程序数据的持久性存储可能会引导您得出这个结论,但它可能不是一个基本属性.

鉴于您可能有其他选项,例如在更新数据时存储新版本的数据,可能会在某种程度上破坏问题的前提.也许,即使你确实有一个'可变'数据库,你仍然需要为更新函数提供一个与旧值分开的新值 - 例如考虑一个乐观锁定,只有当旧值具有更新时才会发生更新没有在此期间改变.

换句话说,数据库的可变性或其他方面根本不重要,您在应用程序中处理单独的域层.如果你需要问,那么答案永远是不可改变的.可变性是一个复杂性向量,专家只有在证明有必要时才应该作为性能优化引入.


Cha*_*ton 5

在我正在进行的交易应用程序中,几乎所有东西都是不可变的 - 当然模型是.

我们的经验是,这极大地简化了我们使用模型的方式,包括持久性.

我不明白为什么事情变得更简单,它只是.我需要更多地思考这个问题.推理代码并使用它更简单.

是的,你需要使用像镜头这样的东西,但我倾向于写它们 - 一个机械过程 - 继续前进.这是一个很小的部分,我相信它可以很精细.


Ton*_*ris 3

“与现实世界交互”与您使用可变还是不可变数据结构无关。这是一个经常重复的毛茸茸的问题,很高兴你对此提出质疑。

虽然像这样消除垃圾通常更健康,但您可能对粗略的揭穿感兴趣: http://blog.higher-order.com/blog/2012/09/13/what-purity-is-and-isnt /

但是,我强烈建议您放弃它并继续前进。

关于你的问题,你说当你想对不可变数据结构执行操作时你有样板。事实上,有一个非常成熟的理论可以在很大程度上解决这个问题。这是一篇使用 Scala 编写的论文:

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

希望有帮助。