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

标签 database database-design schema-design

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

相关文章:

java - 数据库表是否包含另一个表的条目?

mysql - SQL 结构通过随时间的变化来计算队列的大小

sql - 外键引用多个表

sql - MySQL数据库性能调优、schema优化

sql - 如何删除数据库记录并重新使用已删除的主键?

mysql - 这个查询如何破坏我的 mysql 复制?

database-design - 对于电子商务解决方案或付费网络服务来说,什么是好的订单 ID 方案?

mysql - 数据库用户表设计,针对特定场景

java - Java 对象的 XML 模式定义 (XSD) 中的继承

sql - MS ACCESS 数据库分成一个月