sql - 创建 "Many-To-Many"关系的常用方法是什么?

标签 sql database many-to-many

我有 2 个表 Product 包含商店的产品和 ProductStatus 指示产品是新的、已售出的等。一个产品可能有多种状态。

我需要链接产品和状态。我想了两个办法:

  1. 添加第 3 个表 ProductToStatus,它将匹配 ProductIdProductStatusId
  2. Status 列添加到 Product 表,该列将包含以逗号分隔的状态 ID("4,12,34,");

上述每种解决方案的优缺点是什么,或者是否有另一种常用方法?

最佳答案

第一种方式是正确的,也是比较常见的。用于对多对多关系建模的表称为连接表、关系表或联结表等名称。

它对您提出的第二种方式的主要改进是:

  • 更快的数据库操作——例如,如果您想查找具有特定状态的所有产品,使用连接表的查询将非常快,并创建正确的索引,而您建议的第二种方法将意味着在中搜索给定的子字符串每个产品(这会很慢)。
  • 约束检查 - 您可以将 ProductIdProductStatusId 列声明为外键,数据库将阻止您为产品分配不存在的状态。<

连接表的主要缺点是添加/修改产品的代码可能更难编写,因为您需要操作更多的数据库记录。幸运的是,现代 ORM 框架负责所有幕后工作。

关于sql - 创建 "Many-To-Many"关系的常用方法是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8340468/

相关文章:

database - 数据库表中的排序列

mysql - 是否合并头像和资料表?

c# - EF Core - 类中的多对多关系

hibernate - JpaRepository 不会插入多对多数据

java - Hibernate: Createsqlquery.. 为我的实体获取一些列时出错

sql - 在 postgres 中获取一个或多个具有最大值和计数的值

MySQL:我应该如何起草这个数据库?

sql - ADODB : difference between ADDNEW and UPDATE methods?

sql数据库表创建

nhibernate - 如何自动删除多对多关联(级联)