数据库设计一对多,其中许多是至少一个

时间:2009-03-17 16:46:12

标签: database database-design schema-design

与我的previous question有些相关,这是关于强制表模式的创建模式,其中'A'有很多'B'子项,其中'C'是'B'代表'A'的子表,但是至少一个。

目前我有:

A (A_ID primary key, B_ID reference key)
B (B_ID primary key, etc)
C (A_ID reference, B_ID reference)

重点是A肯定总是至少有一个'B''孩子',但可选择多了......但是我遇到的问题是'C'表目前可以引用与'A'相同的'B' '已经是隐含的参考..

示例:

A
- Id: 1
- B_Id: 37

C
- A_Id: 1
- B_Id: 37

什么是约束这个的最好方法?注意'A'可以更新以试图引用'A'中已经在'C'集合中陈述的'B',更可能的是,'C'引用已经明确说明的'B'相关的'A'..

希望这有意义,并再次提前欢呼。

编辑:表格如下:

'A'是提交,提交可以有许多'贡献者'(成员),但总是至少有一个。 'B'是会员 'C'是一个将'A'与多个'B'连接起来的表

3 个答案:

答案 0 :(得分:3)

将您的抽象模式转换为具体模式我相信看起来像这样:

  • 提交(SubmissionID,PrimaryContributorID,...)
  • 贡献者(ContributorID,...)
  • SubmissionContributors(SubmissionID,ContributorID)

这可以为每个提交提供“至少一个”贡献者,但这意味着要执行一些奇怪/困难的规则。由于PrimaryContributorID存在困难 - SubmissionContributors表中是否存在匹配的记录?如果PrimaryContributor更改,您是否必须重新排列SubmissionContributors中的记录?如果PrimaryContributor没有匹配的SubmissionContributor记录,那么每次列出提交的贡献者时,您必须在PrimaryContributor等中加入。

不幸的是,SQL没有“至少一对多”的关系(不管怎样我不知道:)),所以你提出的任何解决方案都会涉及一些妥协。

对我来说,最好的方法是删除PrimaryContributorID;所有贡献者都存在于SubmissionContributors表中,您将拥有强制要求的“至少一”部分的域逻辑(例如,如果没有至少一个贡献者,插入/更新提交记录的方法将失败,以及方法如果没有至少一个贡献者,则读取提交记录将失败。

答案 1 :(得分:1)

我认为不存在您希望/需要在两个单独区域中包含引用的情况。

此外,您希望在一对多关系的多方面具有参考。如果A有1个B,那么B表应该包含A引用,反之亦然。

如果C需要返回A所具有的B,只需使C成为存储过程或连接A和B表的视图,这样数据就永远不会失去同步。

答案 2 :(得分:0)

也许我不理解和过度简化,但是如果在B和A之间设置了主键/外键关系,并且表A中具有B的id的fk字段是必填字段,则它赢了不允许你在A中添加一条没有B记录的记录。如果它比那更复杂,你可能需要通过A上的触发器来强制执行规则。