gpt4 book ai didi

mysql - 一对多和一对一的关系混在一起,怎么办?

转载 作者:行者123 更新时间:2023-11-29 05:32:57 25 4
gpt4 key购买 nike

我的问题可能很愚蠢,因为我认为这是一个非常常见的设计问题,我想有一个简单且常用的解决方案:

  • 我有一张 Producer 表和一张 Movie 表
  • 一个制片人制作了多部电影
  • 一个制片人在他制作的电影中最喜欢一部电影

我如何在 MySQL 中实现它?

  1. Producer 和 Movie 之间只有一个一对多的关系,加上 Movie 表中的“最喜欢的” bool 属性
  2. 一对多关系表示“已经产生”关系,一对一关系表示“最喜欢”关系

第一个解决方案对我来说似乎更自然,但当制作人想要更换他最喜欢的电影时,我猜第二个解决方案更有效率。并且使用解决方案 #2 可以更有效地找到制片人最喜欢的电影。

我错过了什么?有没有最好的解决方案?如果不是,在哪种情况下我应该使用解决方案 #1 和解决方案 #2?

(当然,我的问题比上面的例子要复杂一点...)

最佳答案

(1) 以声明方式执行并不容易/高效。另外,您最终会在所有不喜欢的电影上浪费空间。

(2) 是要走的路。不幸的是,这种循环依赖会导致先有鸡还是先有蛋的问题,这个问题已经解决了:

  • 通过推迟其中一个 FK(如果 DBMS 支持它,不幸的是 MySQL 不支持),
  • 或者将 FK 留给用户 NULL-able,这不太理想,因为用户现在可以拥有零部或一部最喜欢的电影(而不是严格的一部)。

假设您希望同一部电影与多个用户相关(使其成为多对多关系,而不是您所说的一对多关系),您的模型最终在 DBMS 中看起来像这样支持可延迟的 FK:

enter image description here

但是您没有延迟 MySQL 中的约束的奢侈,所以您将被迫做这样的事情:

enter image description here

CHECK (FAVORITE_USER_ID IS NULL OR FAVORITE_USER_ID = USER_ID)

关于mysql - 一对多和一对一的关系混在一起,怎么办?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13235053/

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