如果我想实现Category和Classified之间的关系,是否需要数据库级可空外键,或者应用程序是否可以/建议在不使用数据库约束的情况下定义此类关系?
[注意:因为白点表示“可选”而黑点表示“必需”,因此对于每个类别,相应的分类可能存在也可能不存在。此外,他们之间的乌鸦脚表明这是一个多对多的关系。]
答案 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的好处。
由于您可能会使用某种映射表来定义“类别”和“分类”之间的多对多关系,因此将约束放在那里似乎是明智之举。您的查询将在稍后感谢您。