constraints - 在数据库中强制执行表间约束的最佳方法

标签 constraints database-agnostic

我正在寻找检查表间约束的最佳方法,比前键更进一步。例如,检查日期子记录值是否在两个父行列上的范围日期之间。例如:

Parent table  
ID    DATE_MIN   DATE_MAX
----- ---------- ----------
1     01/01/2009 01/03/2009
...

Child table
PARENT_ID  DATE
---------- ----------
1          01/02/2009
1          01/12/2009   <--- HAVE TO FAIL!
...

我看到两种方法:
  • 在提交时创建物化 View ,如 this article 所示(或其他 RDBMS 上的其他等价物)。
  • 使用存储过程和触发器。

  • 还有其他方法吗?哪个是最好的选择?

    更新 : 这个问题的动机是不是 关于“对数据库或应用程序施加约束”。我认为这是一个累人的问题,任何人都按照她喜欢的方式行事。而且,我很抱歉批评者,我正在开发数据库。 从这里 ,问题是“哪个是管理数据库表间约束的最佳选择?”。我在问题标题上添加了“内部数据库”。

    更新 2 :有人添加了“oracle”标签。当然,物化 View 是 oracle 工具,但我对 感兴趣任何 选项,无论它是在 oracle 还是其他 RDBMS 上。

    最佳答案

    编辑: Dana the Sane 删除了他的帖子,该帖子是不顾 DBA 反对而将其放入数据层的。

    DBA 对像 Dana 这样的开发人员大喊大叫的原因是他们假设应用程序和数据库之间的比例为 1:1。他们看到这一点是因为他们将数据视为支持应用程序的数据,而他们的应用程序只需要将数据存储在一个地方。

    DBA 将数据视为最重要的事情,并不关心应用程序的出现或消失。

    如果您无法使用 MS Word,您会关心您是否仍然可以访问您的文档吗?不,数据对您很重要,应用程序不重要。

    如果你让任何东西绕过你的应用程序来获取你的数据,你就失去了数据层中的约束。如果您的约束在您的数据库层中,那么几十个应用程序都可以使用它。

    理想情况下,您永远不会向任何人授予 INSERT、UPDATE 或 DELETE。相反,您将授予 EXECUTE On 包,这些包将为您执行 CRUD。如果您从一开始就这样做,那么向 CHILD 的 INSERT 添加规则的能力(例如检查出生日期是否在父日期之间)几乎是无限的。

    关于constraints - 在数据库中强制执行表间约束的最佳方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/654096/

    相关文章:

    database - ORA-00936 : missing expression. 向 oracle apex 中的子类型添加约束

    sql - 插入...值(SELECT ... FROM ...)

    database - 有额外约束的外键?

    ios - 我怎样才能从图像中分离出边界?

    java - Hibernate Criteria API 中 Restrictions.like 和 .ilike 的区别

    sql - 代表 NCAA 篮球赛的最佳模式

    orm - 主键 - native 、序列或 GUID 键?

    ios - 在哪里为子类化的 uitableviewcell 创建自动布局约束?

    ios - 来自固有内容大小的自动布局约束