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


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

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

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

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

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

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


10051
2017-10-21 00:24


起源

如果您投票关闭此问题,请告诉我原因。如果已经回答,请提供链接或其他内容。 - Sebastien Lorber
+1我认为这是一个很好的问题。另外,你提到不可变模型导致样板,所以也许你应该尝试可变模型。也许制作快速原型,看看它如何影响设计。 :) - Miguel


答案:


“与现实世界交互”与您是否使用可变或不可变数据结构无关。这是一种经常重复的狡猾,你质疑它是很好的。

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

但是,我强烈建议解雇它并继续前进。

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

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

希望有所帮助。


3
2017-10-21 08:30



镜头+1,但实际上解决方案在我的情况下更简单:我不知道案例类的复制方法:) - Sebastien Lorber


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

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

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


6
2017-10-21 08:17



我不认为关系模型需要可变性,我认为作为一个数学模型意味着它意味着不变性。 - Channing Walton
当然,关系模型没有 - 但这就是通常完成对象关系映射的方式。 - Jed Wesley-Smith


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

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

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

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


5
2017-10-21 11:21



+1体验和诚实。 :) - Miguel
我学的越少,我知道的越少:D - Channing Walton