规范化且不可变的数据模型

2024-05-13

Haskell如何解决“规范化不可变数据结构”问题?

例如,让我们考虑一个表示前女友/男友的数据结构:

data Man = Man {name ::String, exes::[Woman]}

data Woman = Woman {name :: String, exes::[Man]}

如果一个女人改变了她的名字并且她已经和 13 个男人在一起了,会发生什么?那么所有 13 个人也应该被“更新”(在 Haskell 意义上)?需要某种标准化来避免这些“更新”。

这是一个非常简单的例子,但是想象一个具有 20 个实体的模型,以及它们之间的任意关系,那么该怎么办?

用不可变语言表示复杂的标准化数据的推荐方法是什么?

例如,可以找到Scala解决方案here https://github.com/suzaku-io/diode/blob/0e443dec08313ff4cc81fcbab71eb31a8dce6632/doc/usage/ApplicationModel.md(参见下面的代码),并且它使用引用。去哈斯克尔可以玩什么?

class RefTo[V](val target: ModelRO[V], val updated: V => AnyRef) {
  def apply() = target()
}

我想知道,像上面的解决方案(在 Scala 中)这样的更通用的解决方案是否在 Haskell 中不起作用或者没有必要?如果它们不起作用,那为什么不呢?我试图搜索在 Haskell 中执行此操作的库,但它们似乎不存在。

换句话说,如果我想在 Haskell 中对标准化 SQL 数据库进行建模(例如与酸性状态 https://hackage.haskell.org/package/acid-state)有描述外键的通用方法吗?一般来说,我的意思是,不要按照 chepner 在下面的评论中建议的那样手动编码 ID。

EDIT:

换句话说,是否有一个库(用于 Haskell 或 Scala)在内存中实现 SQL/关系数据库(可能还使用事件源进行持久化),使得数据库是不可变的并且大多数 SQL 操作(查询/连接/插入/删除/等)已实现并且类型安全?如果没有这样的图书馆,为什么不呢?这似乎是一个非常好的主意。我应该如何创建这样一个库?

EDIT 2:

一些相关链接:

  • https://realm.io/news/slug-peter-livesey-managing-consistency-immutable-models/ https://realm.io/news/slug-peter-livesey-managing-consistency-immutable-models/
  • https://tonyhb.gitbooks.io/redux-without-profanity/content/normalizer.html https://tonyhb.gitbooks.io/redux-without-profanity/content/normalizer.html
  • https://github.com/agentm/project-m36 https://github.com/agentm/project-m36
  • https://github.com/scalapenos/stamina https://github.com/scalapenos/stamina
  • http://www.haskellforall.com/2014/12/a-very-general-api-for-relational-joins.html http://www.haskellforall.com/2014/12/a-very-general-api-for-relational-joins.html

问题是您以同一类型存储数据和关系。为了正常化,你需要分开。关系数据库 101.

newtype Id a = Id Int -- Type-safe ID.
data Person = Person { id :: Id Person, name :: String }
data Ex = Ex { personId :: Id Person, exId :: Id Person }

现在,如果一个人更改了姓名,则只有一个Person值受到影响。这Ex条目不关心人们的名字。

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

规范化且不可变的数据模型 的相关文章

随机推荐

  • 加载 highchart 时 Android 错误膨胀类

    我正在尝试加载highcharts via Dialog 下面是我的代码 Gradle implementation com highsoft highcharts highcharts 9 0 1 XML
  • 如何使组合键唯一?

    I am making a database of students in one school Here is what I have so far 如果您不喜欢阅读 请跳至 简而言之 部分 问题是我对这个设计并不满意 我想要的组合gra
  • Recoil 中的动态原子键

    我正在尝试创建一个动态表单 其中表单输入字段是根据 API 返回的数据呈现的 由于atom需要有一个唯一的键 我尝试将它包装在一个函数中 但是每次我更新字段值或重新安装组件 尝试更改选项卡 时 我都会收到一条警告 我在这里做了一个小的运行示
  • 在edittext android中插入imageview

    我想将 imageview 放在 edittext 中 可能吗 我检查了 evernote 应用程序 它能够将照片放在编辑文本部分 我想让我的应用程序完全相同 我如何才能将从图库中选择的图像视图放入编辑文本中 我首先尝试将 imagevie
  • 我们为什么使用序列化?

    为什么我们需要使用序列化 如果我们想通过网络发送一个对象或一段数据 我们可以使用字节流 如果我们想将一些数据保存到磁盘上 我们可以再次使用二进制模式和字节流来保存它 那么使用序列化有什么好处呢 从技术上讲 在低级别上 您的序列化对象也将最终
  • 在 Spark MLlib 上使用 Java 中的 Breeze

    在尝试从Java使用MLlib时 使用微风矩阵运算的正确方法是什么 例如scala 中的乘法很简单 matrix vector 相应的功能在Java中是如何表达的 有一些方法 例如 colon times 可以通过正确的方式调用 breez
  • Python中矩阵元素的双重求和

    基于下面的简化示例 我想在我的代码中 from sympy import import numpy as np init printing x y symbols x y mat Matrix x 1 1 y X 1 2 3 Y 10 20
  • Hive - 线程安全的自动递增序列号生成

    我遇到一种情况 需要将记录插入到特定的 Hive 表中 其中一列需要是自动递增的序列号 即在任何时间点都必须严格遵循 max value 1 规则 记录从许多并行的 Hive 作业插入到这个特定的表中 这些作业每天 每周 每月批量运行 现在
  • 可以在 IE 中的表格行上添加渐变吗?

    当我将鼠标悬停在表格特定部分的表格行上时 我希望背景更改为线性渐变 CSS 很简单 tbody row links tr hover background typical multi browser linear gradient code
  • Spring Cloud Gateway 全局异常处理和自定义错误响应

    我有一个自定义过滤器 可以在使用 Spring Cloud Gateway 调用实际 API 之前对每个请求进行身份验证 Spring Cloud中有没有办法像Spring提供 ControllerAdvice一样集中处理异常 我想全局处理
  • 当 mp4 是唯一来源时,自定义 HTML5 视频控件不起作用

    问题 我只有一个视频源 mp4 因为我正在尝试向 tumblr 视频添加自定义控件 如果只有mp4作为源video duration返回为NaN 作为使用 3 个源 mp4 webm ogg 时的测试 它可以工作 所以video durat
  • 与 body 相比,将 css 规则应用于 html 有什么区别?

    我看不出以下之间的区别 html background f1f1f1 and body background f1f1f1 有什么解释吗 没有真正的区别 如果你只是谈论在哪里申请background 否则BoltClock 对另一个问题的回
  • 构建成功时,Intellisense 不断显示错误 Visual Studio 2015

    因此 我正在开发一个 Xamarin 项目 突然 Visual studio 2015 开始崩溃 它几乎在所有内容下都显示错误红线 例如 InitializeComponent 在每个页面中都有红线 项目构建和运行没有错误 错误仅来自 In
  • iPhone 开发 - sqlite3_bind_int 不起作用

    我正在尝试使用以下代码在数据库中插入一些数据 void insertLocationOnDatabase LocationType aLocation sqlite3 stmt stmt int location aLocation loc
  • Carthage 更新错误:“GitHub API 请求失败:凭据错误”

    这是我的购物车文件 Kanna HTML parsing library github tid kijyun Kanna gt 1 0 0 Realm database ORM github realm realm cocoa 当我跑步时c
  • 类型提示:解决循环依赖

    以下产生NameError name Client is not defined 我该如何解决 class Server def register client self client Client pass class Client de
  • 父窗体中的居中消息框[重复]

    这个问题在这里已经有答案了 有没有一种简单的方法可以在 net 2 0中将MessageBox居中于父窗体中 我在 C 中确实需要这个并发现中心消息框 C http bytes com topic c sharp answers 26712
  • 从 Amazon API 网关终端节点输出纯文本内容

    使用 Amazon 的 API Gateway 我可以创建一个端点 该端点将调用输出纯文本的 lambda 函数 但是 当我在端点上发出请求时 输出会返回默认内容类型 application json 这将输出用引号括起来的纯文本响应 我想
  • 方法调用中的插入符[重复]

    这个问题在这里已经有答案了 我正在阅读本教程 并遇到了这行代码 这让我感到困惑 localSearch startWithCompletionHandler MKLocalSearchResponse response NSError er
  • 规范化且不可变的数据模型

    Haskell如何解决 规范化不可变数据结构 问题 例如 让我们考虑一个表示前女友 男友的数据结构 data Man Man name String exes Woman data Woman Woman name String exes