gpt4 book ai didi

SQL 建模/查询问题

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

我目前有这个数据库结构:

alt text

一个条目可以有多个"file"、“文本”和“url”类型的项目。

这些项目中的每一项在文本、网址或文件表(存储数据的位置)中都有一个对应的项目。

我需要一个查询来有效地选择一个条目及其所有相应的项目及其数据。

所以我的第一个方法是这样的

SELECT * FROM entries LEFT JOIN entries_items LEFT JOIN texts LEFT JOIN urls LEFT JOIN files

然后循环它并在我的应用程序中进行后处理。

但问题是,不同类型的多个项目不太可能存在。每个条目存在多个项目的情况甚至是罕见的。在大多数情况下,它将是一个文件。但我还是需要它......

因此,不要扫描所有 3 个表中的每个项目,我认为我可以执行类似 case/switch 的操作,并根据 Entry_items 中“type”的值扫描相应的表。

但我无法让它工作。

我还考虑过在应用程序中制作 case/switch 逻辑,但随后我会有多个查询,这可能会更慢,因为 mysql 服务器将是外部的。

如果你有更好的方法,我也可以改变结构!

我还将“文本”、“网址”和"file"的所有字段都放在表条目_项目中,因为它只是 1:1 关系,并且只将不需要的所有内容都设置为空。这样做的优点/缺点是什么?我认为它需要更多的存储空间,但我无法像现在那样进行约束。一切都需要为空...

我对各种想法持开放态度。应用程序还没有写好,所以我基本上可以随心所欲地改变。

最佳答案

您有三种不同的实体类型(URL、TEXT、FILE)通过中间表 ENTRIES_ITEMS 链接到主 ENTRIES 表,并且您使用这种“条件联接”方法违反了正常形式。鉴于您的结构,不可能在 ENTRIES_ITEMS.id 上声明外键约束,因为 id 列可以引用 URLS、TEXTS 或 FILES 表。要规范化 ENTRIES_ITEMS 表,您必须添加三个单独的字段:urlid、textid 和 fileid,并允许它们可为空,然后您可以通过链接表将三个实体表中的每一个连接到 ENTRIES 表。您所采用的方法在不兼容 SQL92 的旧数据库中很常见,其中以编程方式/过程方式从实体表中获取值,而不是使用 SQL 选择以声明方式获取。

关于SQL 建模/查询问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4564828/

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