有点关系到我的previous question ,这是关于强制执行表模式的创建模式,其中“A”有许多“B”子级,其中“C”是“A”的子级“B”的表,但至少有一个。
目前我有:
A (A_ID primary key, B_ID reference key)
B (B_ID primary key, etc)
C (A_ID reference, B_ID reference)
关键是 A 肯定总是有至少一个“B”“ child ”,但可以选择更多。但是我遇到的问题是“C”表当前可以引用与“A”相同的“B” ' 已经隐式引用..
例子:
A
- Id: 1
- B_Id: 37
C
- A_Id: 1
- B_Id: 37
限制这种情况的最佳方法是什么?注意可以更新“A”以尝试引用“C”集合中已经为该“A”声明的“B”,更有可能的是,“C”引用了已经隐式声明的“B”相关的“A”..
希望这是有道理的,再次提前欢呼。
编辑:表格如下:
'A'是一个提交,一个提交可以有很多'contributors'(成员),但总是至少有一个。 “B”是成员 “C”是一个将“A”链接到多个“B”的表
最佳答案
我认为将您的抽象模式转换为具体模式看起来像这样:
- 提交(SubmissionID、PrimaryContributorID、...)
- 贡献者(贡献者 ID,...)
- SubmissionContributors(SubmissionID,ContributorID)
这可以为每次提交提供“至少一个”贡献者,但这意味着要执行一些奇怪/困难的规则。困难在于 PrimaryContributorID——SubmissionContributors 表中是否存在匹配的记录?如果 PrimaryContributor 发生变化,是否必须重新排列 SubmissionContributors 中的记录?如果 PrimaryContributor 没有匹配的 SubmissionContributor 记录,则每次列出提交的贡献者时,您都必须在 PrimaryContributor 中合并,等等。
不幸的是,SQL 没有“至少一对多”的关系(反正我不知道 :)),因此您提出的任何解决方案都将涉及一些妥协。
对我来说,最好的方法是删除 PrimaryContributorID;所有贡献者都存在于 SubmissionContributors 表中,您将拥有强制要求的“至少一个”部分的域逻辑(例如,如果没有至少一个贡献者,则插入/更新提交记录的方法将失败,并且方法如果没有至少一个贡献者,读取提交记录将失败。
关于数据库设计一对多,其中多至少是一,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/655074/