【问题标题】:MySql add relationships without creating dupesMySql 添加关系而不创建欺骗
【发布时间】:2019-06-30 22:59:51
【问题描述】:

我创建了一个像这样的表(t_subject)

| id | description | enabled |
|----|-------------|---------|
| 1  | a           | 1       |
| 2  | b           | 1       |
| 3  | c           | 1       |

还有一张这样的桌子(t_place)

| id | description | enabled |
|----|-------------|---------|
| 1  | d           | 1       |
| 2  | e           | 1       |
| 3  | f           | 1       |

现在来自t_subject 的数据用于t_place 的每条记录,以显示HTML 下拉列表,以及来自t_subject 的所有结果。

所以我只是这样做

SELECT * FROM t_subject WHERE enabled = 1

现在只针对t_place 记录之一,应隐藏t_subject 的记录。 我不想简单地用 javascript 删除它,因为如果有任何变化,我希望能够自定义所有下拉列表。

所以我想到的第一件事就是在t_subject 中添加一个place_id 列。 但这意味着我必须复制所有 t_subject 记录,每个记录我都有 3 个,除了一个有 2 个。

有什么办法可以避免吗?

我想在t_subject 中添加一个id_exclusion 列,这样我只能在从t_place 的另一个ID 中排除一条记录时复制记录。

那会有多糟糕?到目前为止,这样我就没有重复了。

希望所有这些都有意义。

【问题讨论】:

  • 这两张表是什么关系?我假设这是一个可以拍摄科目位置的数据库?在那种情况下,我假设这是一个多对多的关系?
  • 此时没有关系。我不在乎有一个,因为对于每个位置我都需要所有主题...但是现在我必须从一个位置排除一个主题...我添加了一个 id_location_exclusion 列并添加了一个外键约束t_placeid 列
  • 这里的坏处是我必须distinct 结果以避免将来重复

标签: mysql database duplicates


【解决方案1】:

虽然您只需要排除一门课程,但我仍然建议您建立一个完整的“地点-课程”关联。尽管没有显式链接您的表,但您本质上具有多对多关系。

我会推荐一个额外的“桥接”或“associative entity”表来表示在哪些地方提供哪些课程。这个新表将有两列 - 一列用于 ID 为 t_subject 的外键,另一列用于 ID 为 t_place

例如(t_place_course):

| place_id | course_id |
|----------|-----------|
| 1        | 1         |
| 1        | 2         |
| 1        | 3         |
| 2        | 1         |
| 2        | 2         |
| 2        | 3         |
| 3        | 1         |
| 3        | 3         |

正如您在上面的示例中看到的那样,地点 3 不提供课程 2

从这里,您可以通过查询place_id 简单地查询一个地方的所有可用课程:

SELECT * from t_place_course WHERE place_id = 3

以上将返回13 两个课程。

您可以选择使用JOIN 来获取有关课程或地点的其他信息,例如描述:

    SELECT `t_course`.`description`
      FROM `t_course`
INNER JOIN `t_place_course`
        ON `t_course`.`id` = `t_place_course`.`course_id`
INNER JOIN `t_place`
        ON `t_place`.`id` = `place_id`

【讨论】:

  • 另一种选择是创建一个“排除”表t_place_course_exclude,我们可以存储单行(3,2)。然后我们可以在 t_place 和 t_course 之间使用交叉连接,并在排除表中使用反连接。例如... FROM t_course c CROSS JOIN t_place p LEFT JOIN t_course_place_exclude x ON x.place_id = p.id AND x.course_id = c.id WHERE x.place_id IS NULL ...
  • 是的,这也可以完成这项工作......但我认为黑曜石的方式更清洁!
  • 刚刚部署在生产环境中!再次感谢像魅力一样工作! :D
猜你喜欢
  • 1970-01-01
  • 2011-10-10
  • 2013-05-03
  • 2011-06-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-09
  • 2019-06-05
相关资源
最近更新 更多