【问题标题】:Best way to ensure referential integrity确保参照完整性的最佳方法
【发布时间】:2015-03-25 16:41:17
【问题描述】:

我是一个 SQL 新手,虽然我知道可用的主要工具,但我没有足够的经验来了解某些情况下的最佳工具。

例如,我目前有一组需要参照完整性的表。每个表本身并没有所有必要的列来约束数据,所以我至少有 3 个选项可供选择。

  1. 创建将数据连接在一起的其他表/表 - 除了重复数据之外,这会留下多个文件保持同步。

  2. 创建触发器 - 不太难,但触发器的可信度如何?它是否可扩展?

  3. 创建一个函数 - 我以前没有做过,但我遇到了一个示例,展示了如何使用它来约束跨多个表存储的数据。

鉴于我正在尝试做的事情 - 通过加入数据来保持完整性,我应该考虑什么,这 3 种方法是否都适合我正在尝试做的事情?

这里是一个使用桥接表链接缺失表的示例:

【问题讨论】:

  • “每个表本身并没有所有必要的列来约束数据”为什么不呢?这些表是如何相关的?
  • @D Stanley - 添加了一张图片 - 请随时提出更多问题。
  • Attribute AttributeValue AttributeGroup - 注意不要落入inner platform effect 的陷阱 - 特别是如果你对数据库建模有点陌生。
  • @Jamiec - “内部平台效应”?
  • 不,内部平台效应不仅仅是过度设计。它是关于尝试在数据库中重新创建数据库(至少部分地)。 Product、Attribute、AttributeValue 之类的表表明您正在尝试重新创建数据库做得好的部分,做得不好的部分(Attribute=Product 的列,AttributeValue = 列内的值)。

标签: sql sql-server referential-integrity


【解决方案1】:

使用外键是保证数据一致性的最佳(也是最快和最轻的脚步)方式。如果您想要一个州表来保证仅将有效的州拼写(以及您开展业务的州)添加到销售订单(因此当您搜索所有发往新泽西的销售时,您只需搜索一个拼写)到您的其他表没有比使用 FK 更简单的方法了。

【讨论】:

  • 但是当您说“没有更简单的方法”时 - 有一个表需要持续创建和维护 - 所以这肯定会带来更多的复杂性。
  • 请记住,状态列表将包含您公司处理的所有有效状态。将状态添加到表然后添加到触发器和/或函数要容易得多。您最终将在查询中使用状态表。
  • 我不确定你的状态表是什么意思 - 如果你能提供一个例子会很好。
  • 请看我的解决方案。我建议外键的经典用法是创建一个包含状态列表的表。
  • 我现在明白了-谢谢-但是您所描述的听起来更像是一个查找表-一对一,而我正在描述一种通过组合数据来保持完整性的方案多个表 - 我同意它仍然涉及使用外键,但考虑到复杂性的增加,它可能会导致不同的答案。
猜你喜欢
  • 1970-01-01
  • 2010-09-26
  • 1970-01-01
  • 1970-01-01
  • 2017-12-30
  • 2011-09-17
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多