gpt4 book ai didi

mysql - 如何仅将一个表的一行内容链接到另一个表的一列?

转载 作者:行者123 更新时间:2023-11-29 09:37:06 31 4
gpt4 key购买 nike

我有一个名为 videos 的表。它有三列 id , title , tags 。由于视频的标签可能很多,所以我创建了另一个表,名为 videos_tags ,其中有 id , life , schoolactivity作为其列,以及 idvideos_tags应匹配idvideos

表格videos_tags是这样的:

  id    life    school    activity
123 0 1 0

我的目标是能够获取视频的相应标签。我所做的是我给出了 tag表中的列 videos一个数字应该是 idvideos_tags ,如下

  id    title    tags
1 avideo 123

因此,我将通过以下方式获取标签引用 id:

SELECT tags FROM videos WHERE id=1

然后我会运行 SELECT再次声明通过 id 获取视频对应的标签表中获取的标签的数量 videos ,如下

SELECT * FROM videos_tags WHERE id=123

好了,我们有了需要的标签。

我的问题是:有没有一种方法可以通过某种关系表(例如使用外键)来获取标签,并且它会进一步简化查询代码吗?

我担心的是我使用的方法在tags之间的联系很弱。在表中videosidvideos_tags ,因为当您修改时,比如说 id video_tags的,tagsvideos不会改变,这可能会在某个时候给程序带来一个非常大的问题。

最佳答案

你不明白:

  • 标签独立于(任何为其添加标签的视频)而存在
  • 您的 Video::Tag 的关系是多个、一对多的关系
    • 您已将其设置为 3,并且已修复
    • 如果标签少于三个,则为 NULL
    • 你以后不能再添加标签了……如果你这样做了,那将是心痛、结构改变和代码改变。

因此,你让事情变得比实际情况复杂得多。以及具体修复表格(将来很难改变),当它发生时,一切,所有代码,都必须改变。

Possible duplicate of Recommended SQL database design for tags or tagging

是的。但接受的解决方案不是关系型的,因此它没有完整性;力量;或关系系统的速度。我将一步一步地引导您从您看似理解的内容,到最好的设计。

1960 年代的记录归档系统 • 堕落与疯狂

如果您关注那些声称是“相关”的“文献”或“教科书”或“文章”,您会得出以下结论:

Deranged

  • 我的所有数据模型均在 IDEF1X 中呈现,自 1993 年以来的关系数据库建模标准
  • 我的IDEF1X Introduction是必备读物。

1960 年代的记录归档系统 • 退化

如果您将其提升到 Codd 的关系模型方向,同时保持物理记录 Id 心态,这就是 Yaakov Ellis 的想法意思是“适当的指数等”(我给你的远不止这些)......我们得到这个:

Degenerate

  • 这可以防止重复行(RM 中的基本要求)
  • 它删除了重复的声明,并消除了循环引用和这种特殊的疯狂所导致的可怕后果
  • 每个表仍然有一个额外的Record Id和一个额外的索引,这是支持使用原始记录的数据物理化所必需的,这是完全没有必要的(这些拐杖对于智力障碍,例如 Date 和 Darwen 及其追随者)。
  • 当然,你可以编造介于疯狂堕落之间的任何东西,它仍然停留在1960年代的记录归档系统类别中,缺乏关系能力。<

关系数据库

既然您已经标记了SQL 和关系数据库,您可能希望排除黑噪音并遵循 Codd 的关系模型。如果你这样做,你会得到这个:

Relational

  • 人类用户不会使用 VideoId 编号。 FullTitle 非常长而且麻烦。他们将使用一个简短的标题,这是原始系统中所缺少的
  • 他们也不会使用 TagId。他们想要标签
  • 我给出了更相关的Predicates,方便大家自行查看
  • 轻松添加或删除标签
  • 将来不会发生结构变化,因此也不会更改代码。

SQL

My concern is the approach I used had a weak connection between the tags in the table videos and the id of the table videos_tags, since when you modify, say, the id of the video_tags, the tags in videos will not change, which may cause a really huge problem to the program at some point.

  • 是的,所有这些担忧都已烟消云散。
  • 删除 Id 字段并正确规范化标签即可消除该问题
  • 并且消除了可怕的两步法。
  • 真正的关系数据库的特点之一是可以通过单个 SELECT 命令生成任何报告。

My question is: is there a way to fetch tags by some kind of relational tables which, for example, use foreign keys, and will it simplify the query code further?

另一个特点是简单、直接的 SQL 代码。给定一个视频标题(人们自然会使用的简短标题),找到具有任何标签的视频:

SELECT   VT.VideoTitle    FROM VideoTitle VT      -- outer query    WHERE Tag IN    (SELECT VT_IN.Tag        FROM VideoTag VT_IN -- inner subquery        WHERE VT_IN.VideoTitle = @VideoTitle        )

如果您想在报告中包含完整标题:

SELECT   VT.VideoTitle,         V.FullTitle    FROM VideoTitle VT      -- outer query    JOIN Video V         ON VT.VideoTitle = V.VideoTitle    WHERE Tag IN    (SELECT VT_IN.Tag        FROM VideoTag VT_IN -- inner subquery        WHERE VT_IN.VideoTitle = @VideoTitle        )

关于mysql - 如何仅将一个表的一行内容链接到另一个表的一列?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57364721/

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