scala – 规范化和不可变数据模型
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/ 解决方法
问题是您正在将数据和关系存储在同一类型中.要正常化,你需要分开.关系数据库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条目不关心人们的名字. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |