Sql 确保引用完整性的最佳方法

Sql 确保引用完整性的最佳方法,sql,sql-server,referential-integrity,Sql,Sql Server,Referential Integrity,我是一个SQLNoob,虽然我知道可用的主要工具,但我没有足够的经验知道在某些情况下最好的工具 例如,我有一组需要引用完整性的表。每个表本身并没有能够约束数据的所有必要列,因此我至少有3个选项可以选择 创建将数据连接在一起的其他表-除了重复的数据之外,这会留下多个文件以保持同步 创建触发器-不太难,但触发器的可信度如何?它是可伸缩的吗 创建一个函数——这不是我以前做过的事情,但我遇到了一个示例,展示了如何使用它来约束跨多个表存储的数据 给出我正在做的事情-通过加入数据保持完整性,我应该考虑什么,

我是一个SQLNoob,虽然我知道可用的主要工具,但我没有足够的经验知道在某些情况下最好的工具


例如,我有一组需要引用完整性的表。每个表本身并没有能够约束数据的所有必要列,因此我至少有3个选项可以选择

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

  • 创建触发器-不太难,但触发器的可信度如何?它是可伸缩的吗

  • 创建一个函数——这不是我以前做过的事情,但我遇到了一个示例,展示了如何使用它来约束跨多个表存储的数据

  • 给出我正在做的事情-通过加入数据保持完整性,我应该考虑什么,并且这3种方法都适合我正在尝试做的事情吗? 下面是使用桥接表链接缺失表的示例:


    使用外键是保证数据一致性的最佳(也是最快、最轻的)方法。如果您想要一个州表来保证只有有效的州拼写(以及您在其中开展业务的州)被添加到销售订单(因此,当您搜索到新泽西州的所有销售时,您只需搜索一种拼写)到其他表中,那么使用FKs就没有更简单的方法了

    “每个表本身并没有能够约束数据的所有必要列“为什么不呢?表之间的关系如何?@D Stanley-添加了一张图片-请随时提问。
    属性
    属性值
    属性组
    -注意不要落入陷阱-尤其是如果您对数据库建模有些陌生。@Jamiec-“内部平台效应”?不,内部平台效应不仅仅是过度工程化。它是关于尝试在数据库中重新创建数据库(至少部分地)。像Product、Attribute、AttributeValue这样的表表示您正试图重新创建一个数据库做得好的、不好的(Attribute=Product的Column,AttributeValue=Column中的Value)。但是当您说“没有更简单的方法”时-有一个表需要持续创建和维护-这肯定会带来更大的复杂性。请记住,状态列表将包含您公司处理的所有有效状态。向表中添加状态比向触发器和/或函数中添加状态容易得多。您最终将在查询中使用状态表。我不确定您所说的状态表是什么意思-如果您能提供一个示例就好了。请参阅我的解决方案。我建议外键的一个经典用法是创建一个包含状态列表的表。我现在明白了-谢谢你-但是你所描述的听起来更像一个查找表-一对一,当我描述一个通过跨多个表组合数据来保持完整性的场景时,我同意它仍然涉及外键的使用,但是考虑到复杂性的增加,它可能会导致不同的答案。