外键和检查约束的完整性

时间:2012-02-19 08:25:14

标签: database-design constraints referential-integrity

我正在构建一个系统,该系统是用于存储来自许多其他系统的数据的中央存储库。更新其他系统数据时,需要同步过程来更新中央存储库。将有一个sync_action表来识别中央存储库需要与哪个系统同步以及所需的同步类型。有一组定义的动作不太可能改变。精简系统如下。

在我看来,我可以通过两种方式解决这个问题:

选项1 )拥有一个Action表,其中包含3个可用操作。有一个sync_action表,它使用外键来引用所需的操作。

表:系统

ID Description
 1 Slave System 1
 2 Slave System 2

表:行动

ID  Description
 1  Insert
 2  Update
 3  Delete

表: Sync_action

ID  Action  System
 1     1       1
 2     2       1

选项2 )而不是外键使用sync_action.action列上的检查约束,因此只能插入操作Insert/Update/Delete

表: Sync_action

ID  Action  System
1   Insert    1
2   Update    1

我想知道在确定完整性约束,外键与检查约束之间确定哪种因素是更好的方法。有类似的线程,但我没有找到它们的确定性。这可能是因为它可以解释,但任何想法都会受到赞赏。

干杯

2 个答案:

答案 0 :(得分:8)

评论员似乎非常同意:

对(或多或少静态)引用表进行FOREIGN KEY约束通常更好。原因:

  • 约束很容易“扩展”。要添加或删除选项,您只需在引用表中添加或删除行。您不必删除约束并重新创建它。更重要的是,如果您在其他表中的类似列中也有相同的约束。

  • 您可以附加额外的信息(更多列),如果需要,可以由应用程序读取。

  • ORM可以更好地处理(读取:注意)这些约束。他们只需要阅读一张表,而不是元数据。

  • 如果要更改操作代码,级联效果将处理其他(可能很多)表中的更改。无需编写UPDATE查询。

  • 一个特定的DBMS尚未实现CHECK约束(羞耻),尽管它确实有FK。

正如@pst所提到的(我非常喜欢这种方法),你可以使用合理的代码而不是代理整数ID。所以,你的表可能是:

表:系统

SystemID Description
 1        Slave System 1
 2        Slave System 2

表:行动

ActionCode Description
 I          Insert
 U          Update
 D          Delete

表: SyncAction

ID  ActionCode  SystemID
 1     I          1
 2     U          1

答案 1 :(得分:4)

我认为你混淆了外键约束检查约束之间的区别。

外键约束用于强制引用完整性,检查约束将列限制为仅包含有效数据。在你的情况下,这似乎是一个微小的差异,但如果我们略微抽象它,我希望更清楚。

如果我们考虑使用列users的表user_id, user_name, address_id, join_date, active, last_active_month;我认识到这不一定是最好的做事方式,但它可以满足我的目的。

在这种情况下,将address_id作为约束显然是荒谬的。此列可以包含任意数量的值。但是,active,假设我们需要布尔值y/n,则只能有两个可能的值,而last_active_month只能有12个可能的值。在这两种情况下,拥有一个外键是完全荒谬的。只有一定数量的值,根据数据的定义,这些值不能更改。

在您的情况下,虽然您可以选择检查约束,但除非您绝对确定actions的数量永远不会改变< em>外键是正确的方法。


在一个稍微独立的事情上,正如@pst所提到的,我看到你被代理关键怪物吃掉了。虽然这个可以导致性能提升,但是在您正在设想的大小的表格中(3个值,insert / update / delete)或者甚至更大的表格,它所做的就是模糊你的内容重新努力实现。

查看

并不容易
ID  Action  System
 1     1       1
 2     2       1 

看看发生了什么,但是:

ID  Action  System
 1  insert     1
 2  update     1

更容易阅读;您可能还想考虑为system列做同样的事情 - 我可能会这样做,尽管可能值的数量会略微增加。只是我对此事的个人想法......

相关问题