MySQL链接两个表没有第三个表持有关系

时间:2010-02-18 20:17:06

标签: mysql performance select

说你有两张桌子

table_a

f1 <- PKEY
f2
f3...

table_b

b1 <- PKEY
b2
b3...

现在说table_a与table_b有 MANY到MANY 的关系

通常你会有第三张表来保持这种关系

table_c

c1 <- PKEY
b1 <- PKEY of table_b
f1 <- PKEY of table_a

也说b1 + f1无论出于何种原因都不能成为table_c的PKEY - 只是为了论证。

现在做以下

是否可行/可行

table_a 中,您有 MANY_Bs 字段,其中包含许多关系,如下所示:

table_a

f1:1

f2:'xyz data'

MANY_Bs: '1,2,3,4,5' 

(因此表明table_a中的第1行连接到table_b的第1-5行)

然后使用以下查询来选择这种关系

SELECT * FROM table_a, table_b WHERE
FIELD_IN_SET (table_b.b1, table_a.MANY_Bs)

我担心的是a)失去表现b)失去正常化(我的大脑有点油腻(b)就在现在)

如果有任何MySQL专家可以看到这样的设置有任何问题吗?

非常感谢

4 个答案:

答案 0 :(得分:2)

我认为你会错过使用你提出的方法的一些事情。例如,如果要删除table_b中的内容,则必须在table_a中手动完成级联,不太可读(因为它是非标准的),如果要查找table_a中与table_b行有关系的所有行,它将是因为你不能有任何索引而且必须遍历table_a中的所有行以确保你找到它们。

答案 1 :(得分:1)

我不确定我是否理解你,但如果你想要从table_a到table_b的一对多关系,你只需要将一个外键f1从table_a添加到table_b。

答案 2 :(得分:1)

  

现在说table_a有一对多   与table_b的关系

     

通常你会有第三张桌子   保持这种关系

不,你通常不会有第三张表来表示一对多关系。

请参阅MySQL documentation,它非常清楚地解释了一对多的关系。

答案 3 :(得分:0)

您使用外键关系执行一对多。使用MySQL,使用InnoDB执行此操作。

你可以使用中间的桌子处理多对多。这就是它的完成方式。

现在,你有了一个选择 - 你可以重新发明轮子(不,不要!)或者你可以充分利用一些非常聪明的人制定数据库理论的事实(读取skinny的规范化然后,这是非常重要的,所有其他聪明的人都已经开始构建关系数据库(如MySQL,PostgreSQL,SQL Server,Access,Oracle等)基于他们所做的一切已完成所有数据库理论。皱纹,这里的变化,但它几乎都基于相同的东西。

所以,如果您要设计和构建数据库,请花些时间阅读它们背后的理论,并在脑海中清楚地了解,因为那时您将能够与< / em>数据库,而不是尽管数据库!

这有意义吗?我不是听起来很讽刺,这是我给出的建议,它对我有用!