加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > 安全 > 正文

scala – 规范化和不可变数据模型

发布时间:2020-12-16 09:17:38 所属栏目:安全 来源:网络整理
导读:Haskell如何解决“归一化的不可变数据结构”问题? 例如,让我们考虑一个代表前女友/男朋友的数据结构: data Man = Man {name ::String,exes::[Woman]}data Woman = Woman {name :: String,exes::[Man]} 如果一个女人改变她的名字,她和13个男人在一起怎么办
Haskell如何解决“归一化的不可变数据结构”问题?

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

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

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

如果一个女人改变她的名字,她和13个男人在一起怎么办?那么所有13个人都应该“更新”(在Haskell意义上)呢?需要进行某种规范化才能避免这些“更新”.

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

以不可变的语言表示复杂的规范化数据的推荐方法是什么?

例如,Scala解决方案可以找到here(参见下面的代码),它使用引用.在Haskell做什么?

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

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

换句话说,如果我想在Haskell中建立一个规范化的SQL数据库(例如与acid-state一起使用),那么有一种描述外键的通用方法吗?一般来说,我的意思是,不是在下面的评论中由chepner建议的手编码.

编辑:

换句话说,是否有一个库(用于Haskell或Scala)在内存中实现SQL /关系数据库(可能还使用Event Sourcing进行持久性),以便数据库是不可变的,大部分SQL操作(查询/加入/插入/删除/等)被实现并且是类型安全的?如果没有这样的图书馆,为什么不呢?这似乎是一个很好的主意.我该如何创建这样一个图书馆?

编辑2:

一些相关链接:

> https://realm.io/news/slug-peter-livesey-managing-consistency-immutable-models/
> https://tonyhb.gitbooks.io/redux-without-profanity/content/normalizer.html
> https://github.com/agentm/project-m36
> https://github.com/scalapenos/stamina
> 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条目不关心人们的名字.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读