【发布时间】:2018-03-23 11:38:08
【问题描述】:
我正在使用 F# 对应用程序进行建模,但在尝试为以下递归类型构建数据库表时遇到了困难:
type Base =
| Concrete1 of Concrete1
| Concrete2 of Concrete2
and Concrete1 = {
Id : string
Name : string }
and Concrete2 = {
Id : string
Name : string
BaseReference : Base }
我目前得到的解决方案(我在这里找到了灵感http://www.sqlteam.com/article/implementing-table-inheritance-in-sql-server)是:
我对这个解决方案有两个顾虑:
基表上会有行,即使这在我的模型中没有意义。但我可以忍受。
似乎要查找有关 Concrete2 的 BaseReference 的所有信息的查询会很复杂,因为我必须考虑类型的递归性和不同的具体表。此外,向模型添加新的具体类型必须修改这些查询。除非当然有与 SQL 中的
matchF# 关键字等效的关键字。
我是否过于担心这些问题?或者,有没有更好的方法在 SQL 表中对这种递归 F# 类型进行建模?
【问题讨论】:
-
在我看来,您的类型 Base 大致相当于 (Id, Name) 元组的非空列表?是这样吗,还是你为了问它而删减了这个例子?
-
@RobertNielsen :起初我为了询问而修剪了这个例子,但现在我想我会这样离开((Id,Type)的列表),我将创建另一个表来包含具体类型的公共信息,每个具体表都将使用外键引用的 BasedInformation 表。我这样做是因为否则 Base 表将在行之间包含相同的信息。
标签: f# data-modeling modeling recursive-query recursive-type