SQL - 两个相互依赖的外键

2024-02-10

目前的结构如下:

Table RowType:    RowTypeID

Table RowSubType: RowSubTypeID
                  FK_RowTypeID

Table ColumnDef:  FK_RowTypeID
                  FK_RowSubTypeID (nullable)

简而言之,我将列定义映射到行。在某些情况下,这些行具有子类型,子类型将具有特定于它们的列定义。或者,我可以将那些特定于子类型的列定义挂出它们自己的表,或者我可以将 RowType 和 RowSubType 中的数据合并到一个表中并使用单个 ID,但我不确定这是否是更好的解决方案(如果有的话,我倾向于后者,因为我们最终大多会为给定的 RowType/RowSubType 拉取 ColumnDefs)。

现在的设计是对SQL的亵渎吗?

如果保留当前结构,如果在 ColumnDef 中指定了 RowSubTypeID,如何保持它必须与 RowTypeID 指定的 RowType 相对应?我应该尝试用触发器强制执行此操作,还是我错过了可以解决问题的简单重新设计?


你遇到的问题是第四范式 http://en.wikipedia.org/wiki/Fourth_normal_form.

这是解决方案:

Table RowSubType:       RowSubTypeID
                        FK_RowTypeID
                        UNIQUE(FK_RowTypeID, RowSubTypeID) 

Table ColumnDef:        ColumnDefID
                        FK_RowTypeID
                        UNIQUE(ColumnDefID, FK_RowTypeID) 

Table ColumnDefSubType: FK_ColumnDefID   } compound foreign key to ColumnDef
                        FK_RowTypeID     }   } 
                        FK_RowSubTypeID      } compound foreign key to RowSubType

您只需在 ColumnDef SubType 表中为具有行子类型的列创建一行。但所有引用都受到限制,因此您无法创建异常。

但就其价值而言,我同意@Seth 关于可能存在过度设计的评论。我不确定我是否理解您如何使用这些列定义和行类型,但它闻起来像平台内效应 http://en.wikipedia.org/wiki/Inner-platform_effect反模式。在SQL中,只需使用元数据来定义元数据。不要尝试使用数据来创建动态模式。

另请参阅这个精彩的故事:.


回复您的评论:在您的情况下,我建议使用类表继承或具体表继承。这意味着为每个子类型定义一个单独的表。但是原始文本记录的每一列都将进入子类型表的相应列。这样,您就不需要拥有 rowtype 或 rowsubtype 表,它是通过为每个子类型定义表来隐式实现的。而且您不需要您的columndefs 表,这是表中定义的列所隐含的。

另请参阅我的回答产品表,产品种类很多,每个产品有很多参数 https://stackoverflow.com/questions/695752/product-table-many-kinds-of-product-each-product-has-many-parameters/695860#695860或我的演示幻灯片SQL 中实用的面向对象模型 http://www.slideshare.net/billkarwin/practical-object-oriented-models-in-sql.

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

SQL - 两个相互依赖的外键 的相关文章

随机推荐

  • 离子应用程序的 Keycloak:带有 cordova-native 的 keycloak-js 不起作用

    我正在尝试在我的 ionic 4 cordova 应用程序中使用 Keycloak js 来自 4 4 0 Final 库 我已遵循example https github com keycloak keycloak tree master
  • 错误由于错误而停止(org.apache.kafka.connect.cli.ConnectDistributed)java.lang.NoClassDefFoundError:io/debezium/util/IoUtil

    客观的 我正在尝试使用 Debezium 连接器 1 2 4 Final 从 Kafka Connect 最好是分布式模式 连接到我的 Oracle 数据库 12c 我使用的Kafka版本是2 13 2 6 0 使用的命令 正如所提到的he
  • YouTube 视频嵌入 pyqt

    如何使用 PyQt5 嵌入 youtube 视频 我尝试执行以下操作 但它给了我一个未解决的错误 DirectShowService doRender 未解决的错误代码 from PyQt5 import QtWidgets QtCore
  • 使用 Kerberos S4U 扩展(在 Java 8 中引入)通过 JDBC 连接到数据库

    自从我用 Java 编写代码以来已经有一段时间了 所以我可能遗漏了一些明显的东西 我想通过 JDBC 连接到数据库 我需要支持很多 SQL Server MySQL 等 但是 我想使用 Java 8 中添加的 Microsoft S4U J
  • 如何获取被调用例程中调用函数的名称?

    是否有一种 非内部 方式来获取调用者的姓名 如函数stop does 我的想法是 我有一个小函数来检查输入并在不满足某些条件时停止执行 该函数被其他几个使用相同验证代码的函数调用 如果输入无效 则调用者的环境将被转储 因此我可以看到传递给函
  • SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS 是什么意思?

    我正在尝试使用 onPreviewFrame 回调显示过滤后的相机预览 问题是当我删除这一行时 mHolder setType SurfaceHolder SURFACE TYPE PUSH BUFFERS 隐藏预览 应用程序崩溃 日志中写
  • 将 div 高度设置为等宽 ( javascript )

    我知道这是一个很受欢迎的问题 我已经阅读了解决方案 包括将 padding bottom 设置为相等宽度 以及将其分配给伪元素 以便更容易插入内容 加上其他 CSS 解决方案 css 高度与宽度相同 https stackoverflow
  • 如何在DNN中获取父页面的名称和链接

    我希望子页面上有一个链接 它不仅是父页面的名称 而且还链接到 DNN 中的父页面 在你的皮肤 ascx 文件中使用它 a href a 注意 这是针对 C 皮肤的
  • 在 Windows Phone 7 开发中使用 SQLite

    我是 Windows Phone 7 开发的新手 我使用 SQLite 作为数据库 那么任何人都可以帮助我了解如何使用它吗 如果您有任何有关此问题的帮助链接或论坛 请帮助我 我已经搜索了两天了 但我没有得到我想要的东西 Thanks 您是否
  • Proguard 重复的 Zip 条目

    我试图通过 Proguard 运行我的 Android 应用程序 但是这个不断出现 Warning Exception while processing task java io IOException Can t write C User
  • 在 Rails 的会话中存储对象

    我一直被教导在会话中存储对象是一个坏主意 相反 应该存储 ID 以便在需要时检索记录 但是 我有一个应用程序 我想知道它是否是该规则的例外 我正在构建一个抽认卡应用程序 被测验的单词位于数据库中的一个表中 其架构不会更改 我想存储当前在会话
  • 捕获承诺中的拒绝

    我想保留错误func reject 不直接到onError 通过选择 在我总是让func resolve 并确定后的返回结果yield func 如果我想直接前往onError use throw 想知道有什么更好的主意我可以让func r
  • RedirectToAction 到另一个控制器中的操作不起作用

    在我的 mvc3 POST ActionResult 方法中 我有一部分如下代码 if button Save as Pdf RedirectToAction getPdf Pdf resultObtained 当用户单击按钮时 它会将用户
  • Python配置文件:有什么文件格式推荐吗? INI格式还合适吗?看起来很老派

    我需要存储 Python 应用程序的配置 键 值 并且我正在寻找将这些配置存储在文件中的最佳方法 我遇到了Python的配置解析器 http docs python org library configparser html我想知道 INI
  • 使用 rspec 调用特定 url

    我想在 rspec 中创建一个 get 请求 get exec query gt bla id gt something user id gt user 这会构建一个类似以下的 URL user query something exec q
  • 在静默模式下安装 sqlcmd 接受 EULA

    我正在尝试以静默模式安装 sqlcmd 但我不知道如何自动接受 EULA 我尝试安装的文件名为 MsSqlCmdLnUtils msi 从 MS 下载中心下载 这是我到目前为止所尝试过的 通过谷歌找到 msiexec i MsSqlCmdL
  • 隐藏部分溢出的元素

    我正在寻找一种纯 CSS 方法来隐藏已部分溢出其容器的 div 3 请参阅附图 这是一个可行的解决方案 它将完全隐藏不适合其父级固定高度的项目 Codepen https codepen io PhilippeVay pen JyBQOy
  • 用模型方法查询?

    我在仅对活动对象执行查询时遇到问题 我在数据库中没有活动列 相反 在模型游戏上 我有以下方法 def complete self winner true false end 这样如果一场比赛有赢家 complete 将返回 true 我想查
  • 微服务异步操作HTTP响应

    我们正在构建一个微服务应用程序 客户可以在其中创建projects 下图展示了该过程的技术流程 我的问题 API 网关应向客户端返回什么 HTTP 响应 步骤 1 我最初的想法是返回 202 但问题是我不知道Location yet pro
  • SQL - 两个相互依赖的外键

    目前的结构如下 Table RowType RowTypeID Table RowSubType RowSubTypeID FK RowTypeID Table ColumnDef FK RowTypeID FK RowSubTypeID