【问题标题】:If one table can provide the info we need, do I need to join another table如果一张桌子可以提供我们需要的信息,我需要加入另一张桌子吗
【发布时间】:2021-10-06 19:05:20
【问题描述】:

我有两个表,table1 有一个外键 table2。我想从 table1 获取一些信息,包括 table1 和 table2 都有的列。我应该加入这两个表以获取信息吗? 例如: 我有两张表 Course 和 Student,如下所示

enter image description here

Solution1:

Course
|project CourseId, CouseName, StudentName, StudentId

Solution2:
Course
| project CourseId, CourseName, StudentName
| join Student
on $left.StudentId == $right.StudentId
| project CourseId, CourseName, StudentName
 

获取CourseId、CourseName和StudentName,哪种方案是正确的?选择解决方案 2 是一种好习惯吗?

请忽略表格设计。这只是一个例子。问题来自一个真实的项目,我们需要从一个表中查询,该表包含一个外部 id 和来自另一个表的公共列。查询应该返回公共列。是否需要加入第二个表才能得到公共列?

【问题讨论】:

  • 课程表中为什么会有学生姓名?或者是学生证。课程和学生之间是否应该存在多对多关系?
  • StudentName 违反了第二范式

标签: c# azure-data-explorer


【解决方案1】:

课程表不应该有学生姓名,这是多余的数据。是的,您可以在学生 ID 上使用内连接或左连接。请记住您提供的给定信息,课程表中学生 ID 可以为空或不为空的情况。

【讨论】:

  • 他们是例子。但是,是的,我们在现实世界中使用的真实表包含重复的列。我想知道哪种解决方案应该更好,因为我们可以从一张桌子上得到我们需要的任何东西。加入有效,但有必要吗?
  • 是的。因为你在关系数据库中工作
【解决方案2】:

我相信只有当我们需要来自 2 个或更多表的数据时才应该使用连接的概念。如果您在一个表中拥有所有必需的数据,那么为什么需要联接。如果是你,我一定会以第一个解决方案前进。谢谢

【讨论】:

  • 感谢您的回复。我不想加入,但我被要求加入。我很困惑为什么我们必须加入,因为我们可以从一张桌子上得到我们想要的任何东西
【解决方案3】:

您的表格不遵循这三种规范化形式。

如果我们谈论的是为学校设计数据库或类似的东西的常见场景,这就是实体和关系的组织方式。

Courses 和 Students 之间是多对多的关系,这允许我们将 N 个学生关联到一门课程,将 M 门课程关联到一个学生(一门课程可以有多个学生参加,一个学生可以参加多个课程) .

此外,此设计遵循第三规范化形式。

Learn more about normalization forms

Learn more about Many to Many relationships

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-06-20
    • 2021-07-04
    • 2011-08-24
    • 2014-07-13
    • 1970-01-01
    • 2014-01-24
    相关资源
    最近更新 更多