3

与我之前的问题有点相关,这是关于强制执行表模式的创建模式,其中“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' 是一个提交,一个提交可以有多个“贡献者”(成员),但总是至少有一个。'B' 是一个成员 'C' 是将一个 'A' 链接到许多 'B' 的表

4

3 回答 3

3

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

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

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

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

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

于 2009-03-17T21:29:25.763 回答
1

我不认为您会希望/需要在两个单独的区域中包含参考。

此外,您希望在一对多关系的多方面获得参考。如果 A 有 1+ B,则 B 表应包含 A 引用,反之亦然。

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

于 2009-03-17T16:57:48.713 回答
0

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

于 2009-03-17T17:38:22.767 回答