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

2024-06-19

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

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

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

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

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

(我已经问过一个类似的问题,对于我使用的技术来说非常具体 https://stackoverflow.com/questions/12882099/how-to-update-object-in-mongo-with-an-immutable-salat-case-class,但我对实际答案并不满意,所以我在这里概括了它。)


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

鉴于您可能有其他选择,例如在更新数据时存储新版本的数据,也许问题的前提在某种程度上被破坏了。也许,即使您确实有一个“可变”数据库,您仍然需要为更新函数提供一个与旧值分开的新值 - 例如考虑乐观锁,其中仅当旧值已更新时才应发生更新并没有同时改变。

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

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

我应该用不可变或可变的数据结构来表示数据库数据吗? 的相关文章

  • 用 MySQL 修剪逗号?

    我有一个如下所示的关键字列表 数据库中的一些关键字列表具有前导或尾随 keyword keyword keyword keyword 如何修剪前导和 或尾随 使用mysql 我尝试过使用trim但似乎无法让它工作UPDATE 这就是我想要实
  • Common Lisp 中的重复元素 [关闭]

    很难说出这里问的是什么 这个问题是含糊的 模糊的 不完整的 过于宽泛的或修辞性的 无法以目前的形式得到合理的回答 如需帮助澄清此问题以便重新打开 访问帮助中心 help reopen questions 我尝试创建一个函数two argum
  • 什么时候多线程不是一个好主意? [关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • CakePHP PHPUnit 装置每次都会删除数据库表

    我正在尝试对我的模型运行简单的单元测试 问题是每次运行测试时 我的数据库表都会被删除 我有 public dropTables false 任何人都可以弄清楚为什么merchant rejects 表仍然被删除吗 正如您将看到的 我在我的装
  • 哪个数据库对复制的支持最好

    我对 MySQL 复制的功能有相当好的感觉 我想知道还有哪些其他数据库支持复制 以及它们与 MySQL 和其他数据库相比如何 我的一些问题是 复制是内置的还是附加组件 插件 复制是如何工作的 高级 MySQL 提供基于语句的复制 5 1 中
  • 为什么 PostgreSQL 中的聚合函数不适用于布尔数据类型

    为什么我们不能在聚合函数中使用布尔值而不先转换为某种整数类型 在许多情况下 从布尔数据类型的列计算总和 平均值或相关性是非常有意义的 考虑以下示例 其中布尔输入必须始终转换为int为了使其发挥作用 select sum boolinput
  • 保持服务器和客户端之间的验证逻辑同步[关闭]

    Closed 这个问题是基于意见的 help closed questions 目前不接受答案 In my 上一个问题 https stackoverflow com questions 39371 database exception h
  • 尝试使用连续传递风格来避免极小极大算法的堆栈溢出

    我的目标摘要 弄清楚如何使用连续传递样式来避免在使用我认为无法进行尾递归的算法时出现堆栈溢出 或者 找到一种方法使函数成为尾递归 Details 我是 F 以及一般函数式编程 的新手 我正在尝试通过 alpha beta 剪枝实现极小极大算
  • 为什么需要在 JavaScript 中冻结对象?

    我不清楚何时有人需要使用Object freeze在 JavaScript 中 MDN 和 MSDN 没有提供有用的现实生活示例 我知道尝试在运行时更改这样的对象意味着崩溃 问题是 我什么时候会欣赏这次崩溃 对我来说 不变性是一个设计时间约
  • 合并具有一对一关系的表

    我有 3 个用于会员系统的 MySQL 表 users 成为用户的最低要求 仅与帐户信息相关 电子邮件 密码 is activated 等 user profiles 用户提供的个人信息 姓名 地址 电话 user member profi
  • 关闭准备好的语句

    使用PreparedStatements 和ResultSets 是否会在每次使用时创建一个 新的数据库实例 或者 换句话说 如果我使用PreparedStatement和ResultSet 我应该在每次使用后或完成后关闭它们吗 Examp
  • F# 中灵活类型注释的用途是什么?

    我正在学习 F 我不明白灵活类型的目的 或者更好的是 我无法理解这样写的区别 set TextOfControl c Control s c Text lt s 并写下 set TextOfControl c T when T gt Con
  • 更改子组件状态会更改父组件 props

    父组件是一个header 子组件是一个form它用于在保存后更改标头中出现的值 从而触发 redux 操作 我设置了子状态 constructor props super props this state object props obje
  • 如何简洁地写一个 || b 其中 a 和 b 是可选值?

    我对任何语言的答案都很满意 但我最终想要 Java 的答案 Java 8 没问题 不限于 Java 8 我尝试修复标签 如果我有两个Optional
  • Laravel 插入三向数据透视表

    Summary 我正在构建音乐发现服务 我的问题是 如何将数据插入三向数据透视表 标签 跟踪 用户 Schema 我看到了这个架构在 LaravelSD http www laravelsd com share WNmzz8 它由六个主表
  • “真正的”多维数组的定义是什么以及哪些语言支持它们?

    我读过的大多数编程书籍都有以下几行 X 语言不支持真正的多维数组 但您可以使用数组的数组来模拟 近似 它们 由于我的大部分经验都是基于 C 的语言 即 C Java JavaScript php 等 因此我不确定什么是 真正的 多维数组 a
  • Haskell - 让函数返回空字符

    我正在尝试创建一个函数来删除字符串中的每个第 n 个元素 dropEvery String gt Int gt String dropEvery str n map char indx gt if indx mod n 0 then cha
  • Haskell 中的纯函数是否有可能改变变量的本地副本?

    Haskell 中的纯函数是否有可能改变变量的本地副本 就像 clojure 中提到的那样函数式编程是一个骗局 http swannodette github io 2013 06 10 porting notchs minecraft d
  • 保存用户的身高和体重

    我应该如何将用户的身高和体重存储在MySQL数据库中 以便我可以使用这些信息来查找特定身高或体重内的用户 另外 我需要能够以英制或公制显示此信息 我的想法是存储以厘米为单位的身高和以公斤为单位的体重信息 我更喜欢公制而不是英制 我什至可以让
  • LISP - 破坏性和非破坏性构造

    正确的定义是什么破坏性的 and 非破坏性的在 LISP 或一般情况下 中构造 我试图寻找真正的含义 但我只发现了这些术语的很多用法 而没有真正解释它们 据我了解 通过破坏性的函数是指一个函数 它改变构造 或变量 的含义 所以当我将一个列表

随机推荐