mysql多表外键? - 初学者

Posted

技术标签:

【中文标题】mysql多表外键? - 初学者【英文标题】:mysql multi table foreign keys? - beginner 【发布时间】:2010-12-25 10:20:17 【问题描述】:

我有两张桌子,

Table1: 
id, int1, int2, int3
john,1,2,4
tim,2,3,4
pete,1,3,4

Table2:
integer,blob
1,wins
2,backtickle
3,text
4,whatever

给定我要使用的查询的 id 我想从 table2 中获取与 table1 中的每个整数列相关联的 blob 数据。

我可以在这里使用的具体查询是什么?

我正在寻找的示例结果类似于:

搜索 John 返回“wins”、“backtickle”、“whatever”

搜索皮特返回 "wins","text","whatever"

我认为这与外键有关,但不确定...请初学者级别!对于 1 个表,它将是 SELECT * FROM table1 WHERE id="........" 但不确定我现在上面给出的设置。

【问题讨论】:

【参考方案1】:

您的数据库结构看起来并不理想。您将自己限制为每人 3 个项目,并且您使用列而不是行来列出它们。您在数据中实际拥有的是 Table1 和 Table2 之间的多对多关系。我建议使用三个表:

Persons: 
name, personid
john,1
tim,2
pete,3

PersonBlobs:
personid, blobid
1,1
1,2
1,4
2,2
2,3
2,4
3,1
3,3
3,4

Blobs:
blobid,blob
1,wins
2,backtickle
3,text
4,whatever

PersonBlobs 将为您提供 Person 和 Blob 之间的多对多链接。

然后查询变成:

select Blobs.blob
from Blobs inner join PersonBlobs on Blobs.blobid = PersonBlobs.blobid
           inner join Persons on PersonBlobs.personid = Persons.personid
where Persons.name = 'John'

【讨论】:

我喜欢你的三角帆,但是对于大桌子来说这不会慢很多吗?比如说 100,000 人,每个人有 100 件东西? 尤其是每个人有 100 件事情,你不能为他们使用列。行和列之间有一个主要区别:当您向数据库添加更多数据时,您会添加更多 ROWS。列代表数据的类型,而不是数据本身。列是您在创建数据库后决定的东西,您很少向表中添加更多列。数据库针对我建议的内容进行了优化,您可以确定具有数百万行的表不是数据库无法处理的。 但是为什么会存在超过 2 列呢?它们一定有一些用处……对吧? 当然,您可以创建任意数量的列,但是添加更多列会更改表的结构,而不是其数据。例如,如果一个人有名字、姓氏、地址和电话号码,那么您的 Persons 表将有 5 列(一列用于 ID,四列用于其他数据)。 另请注意,不建议使用“SELECT *”,因为它会使查询结果依赖于表结构的未来变化。最好专门列出您选择的列。

以上是关于mysql多表外键? - 初学者的主要内容,如果未能解决你的问题,请参考以下文章

MySQL多表

MySQL 连接表外键

主索引列上的 MySQL 表外键索引

mysql外键使用

初学者必备:Mysql中常见的报错(制作不易)

初学者必备:Mysql中常见的报错(制作不易)