sql - 奇怪的多对多和一对多关系

标签 sql constraints

我知道我会投票,但我必须确定这是否合乎逻辑。

我有三个表 A、B、C。B 是用来在 A 和 C 之间建立多对多关系的表。但问题是 A 和 C 在一对多关系中也直接相关

一位客户添加了以下要求:

从表B中获取与A和C内联的信息,在同一个查询中将A和C以一对多的关系关联起来

就像是:

alt text http://img247.imageshack.us/img247/7371/74492374sa4.png

我尝试进行查询,但总是返回 0 行。客户坚持我能完成要求,但我对此表示怀疑。任何意见?

附注。我没有更具描述性的标题,有什么想法吗?

更新:
感谢 rcar,在某些情况下,这可能是合乎逻辑的,以便获得学生上过的所有类(class)的历史记录(假设学生一次只能上一门课)

更新:
有一个联系人表、一个包含每个联系人信息的表和关系表。要获取联系人的信息,我必须与信息建立 1:1 关系,并且每个联系人都可以拥有喜欢和地址簿;这就是实现多对多关系的原因。

完整的想法是获取联系人的姓名和他的地址簿。
现在我得到了客户的想法......我在查询时遇到了问题,基本上我正在尝试使用 jdecuyper 编写的查询,但正如他警告的那样,我没有得到任何数据

最佳答案

这是一个可行的方案。您可以在查询中两次连接一个表,通常为其分配不同的别名以保持正常。

例如:

SELECT s.name AS "student name", c1.className AS "student class", c2.className as "class list"
FROM s
JOIN many_to_many mtm ON s.id_student = mtm.id_student
JOIN c c1 ON s.id_class = c1.id_class
JOIN c c2 ON mtm.id_class = c2.id_class

这将为您提供来自 many_to_many 表的所有学生姓名和“硬编码”类(class)以及他们所有类(class)的列表。

也就是说,这个模式没有逻辑意义。据我所知,您希望学生能够拥有多个类(class),因此 many_to_many 表应该是您想要查找与学生关联的类(class)的位置。如果表 s 中使用的 id_class 条目与 many_to_many 中的条目不同(例如,如果 s.id_class 指的是只出现在该表中的类(class)分配,而 many_to_many.id_class 指的是学分类(class)并且不包括类(class)类(class)),你最好将 c 拆分成两个表。

如果不是这种情况,我很难理解为什么您希望将一个类硬连接到 s 表。

编辑:刚刚看到你的评论,这是一个虚构的模式来举例。在其他情况下,这可能是一种明智的做事方式。例如,如果您想跟踪公司位置,您可能有一个 Company 表、一个 Locations 表和一个 Country 表。 Company 表可能有一个指向 Country 的 1-many 链接,您可以在其中跟踪公司的总部所在国家/地区,但有一个通过 Locations 的多对多链接,您可以在其中跟踪公司拥有商店的每个地方。

如果您可以提供有关架构对您的客户真正代表什么的真实信息,我们可能更容易确定在这种情况下它是否合乎逻辑。

关于sql - 奇怪的多对多和一对多关系,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/228705/

相关文章:

ios UIViewController 以编程方式定位按钮不起作用

mysql - 如何在 MySQL 表上添加自定义 CHECK 约束?

sql - 根据另一列的值在一列上添加多个 CHECK 约束

java - 使用条件计算 hibernate 中按行分组的数量

sql - SELECT语句中的日期始终相同

php - 为什么列别名在 Doctrine 中不起作用?

sql - PostgreSQL,在SQL中为记录字段添加前缀

javascript - 是否有相当于 ios 自动布局约束概念的 JavaScript 或 Web 开发库?

javascript - 如何从合并结果集中提取数组?

xcode - 将所有 subview 移动到容器 View ,保持位置和约束