【问题标题】:Should I represent database data with immutable or mutable data structures?我应该用不可变或可变的数据结构来表示数据库数据吗?
【发布时间】:2012-10-21 00:24:15
【问题描述】:

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

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

Martin Odersky 在 Coursera 上的 Scala 课程之后,我记得他说过这样的话:

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

所以,再次,我想知道我应该怎么做。到目前为止,我的数据结构是不可变的,当我想更新数据库中的记录时,这会导致大量的样板代码。使用可变模型是否有助于减少这种样板?

(我已经问过a similar question which was quite specific to the technologies I use,但我对实际答案并不满意,所以我在这里概括一下。)

【问题讨论】:

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

标签: database language-agnostic functional-programming immutability


【解决方案1】:

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

鉴于您可能有其他选择,例如在更新数据时存储新版本的数据,因此问题的前提可能会受到一定程度的破坏。也许,即使您确实有一个“可变”数据库,您仍然需要为更新函数提供一个与旧值分开的新值 - 例如考虑一个乐观锁,其中只有在旧值有更新的情况下才会发生更新在此期间没有改变。

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

【讨论】:

  • 我不认为关系模型需要可变性,我会认为作为一个数学模型意味着它意味着不变性。
  • 当然,关系模型不会——但这通常是对象-关系映射的方式。
【解决方案2】:

在我目前正在开发的交易应用程序中,几乎所有内容都是不可变的——当然模型也是如此。

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

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

是的,您需要使用镜头之类的东西,但我倾向于编写它们 - 一个机械过程 - 然后继续前进。这是一个很小的部分,我相信它可以被巧妙地处理。

【讨论】:

    【解决方案3】:

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

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

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

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

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

    希望对您有所帮助。

    【讨论】:

    • +1 用于镜头,但实际上解决方案在我的案例中更简单:我不知道案例类的复制方法:)
    猜你喜欢
    • 2016-01-07
    • 1970-01-01
    • 2015-04-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多