我有一个我不太明白的例子。解决它的最佳方法是什么?
一张名为usuarios
.
一张名为publicaciones
.
如果我打算将帖子的记录与id
注册用户的记录一起保存;以下结构正确吗?
但是例如考虑publicaciones-usuarios
到可以创建一个调用类似于以下结构的中间表:
什么是最佳方式?,例如,如果我使用inner join
以下内容制作第一个结构:
SELECT titulo, cuerpo, username FROM publicaciones
INNER JOIN usuarios
ON usuarios.id = publicaciones.usuarios_id
WHERE usuarios.id = 2;
考虑到两个表之间的链接是id
用户的链接作为表中的外键,我可以提取用户发布的出版物publicaciones
;但我不太明白每个在什么场景下使用
考虑到我试图澄清这个疑问,这只是一个例子
关系本身
回答您问题的根本问题不是使用这种类型的关系我是否可以获得此类数据,而使用这种其他类型的关系我无法获得它。
实际上,如果计划得当,任何类型的关系都可以平等地获得数据。
简而言之,我们可以说:
一对多关系
仅适用于:
或相反亦然:
多对多关系
适用于:
根据您的应用程序的设置方式,根据它处理的数据的实际情况,您将必须决定要实现哪种类型的关系。
换句话说,您的应用程序要处理的数据的真实情况是什么?:
最佳模式
至于做事的最佳方式,正如@gbianchi 在他的评论中所说。最佳模式是一种优化您想要在数据库中执行的操作,遵守业务规则的模式。
根据您处理的数据的实际情况,仅仅拥有一种类型的关系是不够的。在表的定义中仍然存在必须绑定的松散端,例如用于加快数据检索、控制重复记录、添加防止孤立记录存在的参照完整性约束等的索引。
获取数据
无论您使用什么关系,您始终可以从表中获取您想要的数据。
让我们来看看:
以一对多关系获取数据
以多对多关系获取数据
在这两个示例中,都获得了相同的列。唯一不同的是
JOIN
,根据我们创建关系的方式,通过相应的方式获取数据的方式。我的意思是你不能定义一个关系,认为它对你如何获取数据有一些影响。它没有任何含义。在这两个示例中,我们
nombre
从 tableusuarios
和titulo
table获得相同的列publicaciones
。因此,我们可以获得参与关系的任何列。另一件事是获取分组数据的事实,例如在多对多关系的情况下。
GROUP_CONCAT
为此,在 MySQL 的特定情况下,还有分组函数,例如。