gpt4 book ai didi

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

转载 作者:搜寻专家 更新时间:2023-10-30 20:13:44 25 4
gpt4 key购买 nike

有点关系到我的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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com