在数据库或应用程序中实现外键?

时间:2009-05-29 19:05:49

标签: database foreign-keys

如果我想实现Category和Classified之间的关系,是否需要数据库级可空外键,或者应用程序是否可以/建议在不使用数据库约束的情况下定义此类关系?

[注意:因为白点表示“可选”而黑点表示“必需”,因此对于每个类别,相应的分类可能存在也可能不存在。此外,他们之间的乌鸦脚表明这是一个多对多的关系。]

alt text

3 个答案:

答案 0 :(得分:4)

由于它是多对多关系,因此您需要交叉引用表而不是简单的外键列。

因此,Category表没有FK to Classified,而Classified没有FK到Category。相反,你可以有一个新表:

XrefCategoryClassified
  FK to Category NOT NULL
  FK to Classified NOT NULL

这是实现多对多关系的典型方式。现在,如果两个记录不相关,而不是担心NULLable字段,你只关心外部参照记录的存在与否

答案 1 :(得分:3)

为什么不同时使用?

出于某种原因,外键,检查约束等被称为“声明性参照完整性”。他们保护您的数据。如果您在下个月添加批量加载,或者您必须运行SQL脚本来更改数据,该怎么办?

另一点是数据库引擎是正确的工具。

答案 2 :(得分:1)

如果没有令人信服的理由,我会在数据库级别强制执行引用完整性;毕竟那是(部分)RDBS的好处。

由于您可能会使用某种映射表来定义“类别”和“分类”之间的多对多关系,因此将约束放在那里似乎是明智之举。您的查询将在稍后感谢您。