我正在构建一个系统,该系统是用于存储来自许多其他系统的数据的中央存储库。更新其他系统数据时,需要同步过程来更新中央存储库。将有一个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
我想知道在确定完整性约束,外键与检查约束之间确定哪种因素是更好的方法。有类似的线程,但我没有找到它们的确定性。这可能是因为它可以解释,但任何想法都会受到赞赏。
干杯
答案 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
列做同样的事情 - 我可能会这样做,尽管可能值的数量会略微增加。只是我对此事的个人想法......