Laravel 多对多关系:Pivot VS JSON

Posted

技术标签:

【中文标题】Laravel 多对多关系:Pivot VS JSON【英文标题】:Laravel Many to Many Relationship : Pivot VS JSON 【发布时间】:2021-10-02 10:12:25 【问题描述】:

我想就这个在 JSON 或数据透视表之间选择的困境获得您的专家意见

假设我们这里有 2 张桌子

    人 工作

一个人可能有多个工作,唉,一个工作可能有多个人订阅它。 最好的方法是什么?

方法一:JSON

我会在people 表中有jobs 列,其中包含该人的工作ID 的json 数组,例如:[1,2,4]

方法2:枢轴

我会创建带有job_idperson_id 列的数据透视表job_person,好吧,你知道Laravel Eloquent 风格的多对多数据透视表

我进行了一些搜索,发现文章支持每种方法,有人说 JSON 更好,因为它更简单,其他人会说 Pivot 更好,因为关系数据库应该是这样工作的,等等。

但我想知道,在什么情况下我应该使用哪一个?如果只是像上述场景这样的简单案例,JSON会更好吗?

如果包含其他变量(例如附加数据透视列)怎么办 (也许每个枢轴还包含status 列,可以设置为activepast_job

或者,如果将来我们希望能够让所有有特定工作的人,在这种情况下,我认为 Pivot 会更可取。

如果另一个表不是jobs,而是books,并且一个人可以拥有大量books,那么我们可能只为一个人拥有数十甚至数百个数据透视记录?还有一百个人?

如果另一个表不是books,而是stocks,在这种情况下,一个人可能会多次订阅/取消订阅多个股票?

也许对于基本原则,每个人的优点/缺点是什么?

非常感谢

【问题讨论】:

【参考方案1】:

我宁愿不选择 JSON,因为选择它没有任何好处,您将牺牲许多数据库功能,并且查询数据变得困难和缓慢。

如果包含其他变量(例如附加枢轴)怎么办 列(也许每个枢轴还包含可以设置的状态列 到 active 或 past_job)

Job 和 Person 不相互依赖,因此您需要在它们之间创建一个关联表,例如“PersonJob”并为其添加必要的信息,这在 Laravel 中很容易遍历。

或者,如果将来我们希望能够让所有人 有一个特定的工作,在这种情况下,我认为 Pivot 会更好。

您可以使用关联表轻松查询。

也许对于基本原则,每个人的 优点/缺点?

只是关系数据库是为这类东西而设计的,而 JSON 没有任何价值,只是困难。

【讨论】:

好的,所以基本上,在每种情况下,使用 pivot 的关系都优于 json。非常感谢

以上是关于Laravel 多对多关系:Pivot VS JSON的主要内容,如果未能解决你的问题,请参考以下文章

Laravel Eloquent 根据数据透视表字段条件获取多对多关系

是否可以使用 findAll() 创建查询并通过使用来自 pivot 的 ForeignKey(关系多对多)获得过滤结果?

多对多关系 - 如何更新数据透视表中的属性

Laravel 5 更新所有 Pivot 条目

多对多表 id 的最佳实践

Laravel 多对多查询