数据库设计基础:如何创建“多对多”(M:N)关系,以及何时需要这种类型的关系,简单明了的例子讲解。
何时需要"多对多"(M:N)关系?
当我们想将表A中的任何记录绑定到表B中的多个记录的同时,又将表B中的任何记录绑定到表A中的多个记录时。
让我们考虑一个真实的示例,在在线商店的数据库设计中:我们有用户和产品。
用户在购买之前将产品添加到虚拟购物车中。从架构的角度来看,这意味着什么?一个用户可以将多个不同的产品添加到购物车中。一对多?不要急于下结论:同样的产品可以被完全不同的用户添加到购物车中!
那么,我们如何最有效地存储哪些产品被哪些用户添加到购物车中的数据呢?"多对多"关系来给我们提供帮助!
如何创建"多对多"(M:N)关系?
我们需要创建一个额外的表,在其中指定关系。为此,该表仅需要两个列:第一个将保存表A中记录的唯一标识符(id)(在我们的例子中是用户),第二个将保存表B的id(在我们的例子中是产品)。我们给这个表起个有意义的名字 - cart。
在大多数情况下,M:M关系表通常命名为:表A名称_表B名称。但是,如果你认为根据意义命名更清晰,我建议根据其意义命名。
"多对多"关系的样子:
如何操作"多对多"(M:N)关系?
让我们用我们的示例来分析。当用户将产品添加到购物车时:
INSERT into cart (user, product) VALUES ( user.id, product.id );
这就是不同用户添加不同产品的方式。现在,我们可以聪明地提取特定用户购物车的内容:
SELECT
p.id,
p.name,
p.price
FROM
product p,
cart c
WHERE
c.product = p.id
AND
c.user = ?;
其中问号替换为用户的唯一标识符(id),我们获得该特定用户购物车中所有产品的详细信息。
如果用户从购物车中删除产品,我们只需从购物车表中删除匹配产品id和用户id的记录。这非常简单:
DELETE FROM cart WHERE user = user.id AND product = product.id;
关系数据库的主要优势在于,我们可以仅存储用户购物车中该相同产品的唯一记录号,而不是存储所有有关该产品的信息。借助这个唯一编号,我们可以提取有关该产品的所有信息,这适用于数据库中的任何记录。
我们还可以提取通过该关系获得的记录的其他关系信息。这样,我们就消除了数据重复,换句话说,我们规范化了数据。
在相邻的文章中,你可以找到关于其他类型关系数据关系的信息:一对多和一对一,以及有关规范化的更详细信息。如果你正处于数据库架构设计的起步阶段,一定要了解这些信息。
如果你觉得有用,可以通过点赞/评论/订阅来支持我 我的教育YouTube频道。