多对多表id的最佳实践

jucafojl  于 2021-06-19  发布在  Mysql
关注(0)|答案(1)|浏览(291)

我对多对多表id(主键)有一些疑问。根据laravel文档,多对多关系由两个模型和三个表组成。每个模型都有相应的表,中间表有as字段:
自动增量id
表1\u id
表2\u id
其他属性。。。
到目前为止,一切正常。我已经用了很多,用助手'pivot'访问字段,用'updateexistingpivot'更新这些字段等等。
我的问题是,是否值得从其他表的属性中利用中间表(如fk)的id。
例子:
在我的应用程序中,我有以下模型:
机器
产品
限制
这四张table:
机器(id,名称,…)[机器]
产品(id、名称……)【产品】
机器产品(id,机器id[fk],产品id[fk],价格)[无型号]
限制(id,machine\u product\u id[fk],day,begin\u hour,end\u hour)[限制]
给定特定的机器和产品,有n个限制。一个限制属于一个特定的机器和产品。
如您所见,我利用了autoincremental id(中间表的主键)来关联限制。但这样看来,与雄辩者合作有点奇怪,就像访问 RestrictionMachine / Product 反之亦然,这并不容易:

Restriction::where('machine_product_id', Machine::find(1)->products()->first()->pivot->id );

如果我能得到一个 Product 或者 Machine 从给定的 Restriction ,我必须从包含 machine_product_id 我的限制。
我不知道在使用elokent时,对于实用性和功能性问题,最好使用两个多对多表 machine_id and product_id ,一个是 price (machine_products) 另一个带着 day, begin_hour, end_hour (restrictions) . 第一个表是1到1(机器产品)和其他1到n(限制)。我是说: machine_products 只有一个价格,给定一个特定的机器id和一个产品id。 restrictions 给定一个特定的机器id和产品id,将有n行集合,包括day、begin\u hour、end\u hour。
或者我做一个叫做 MachineProduct ? 我不知道。。。
你能告诉我或推荐解决这个难题的最佳方法吗?已经在修改表格、模型或其他任何东西了。
谢谢您。

9ceoxa92

9ceoxa921#

如果您只对您的机器和产品实体应用严格的实体关系设计,那么中间表将只有两列。

machine_id  INT PK  FK to machine.id
 product_it  INT PK  FK to product.id

这实现了 Machine :: many-to-many :: Product 关系。
这个中间表将有一个复合主键。主键的唯一性将决定每台机器只能与每个产品有一个关系。通过插入一行来创建关系,并通过删除该行来切断关系。
但您的实际应用程序还有两个方面,价格和限制。看起来您的应用程序要求价格与机器和产品都有关系。
因此,我们需要另一个实体来清楚地描述您的应用程序。我们称之为工作吧。每个工作都有一个 price 属性。它用一台机器生产一种产品。因此它有这些关系。

Machine  :: many-to-one :: Job 
  Product  :: many-to-one :: Job

你的 machines_products 因此,表不是一个纯粹的many:many intermediate table。相反,它是并且应该被称为job表(或者您所说的machineproduct表)。
最后,您有了一个具有此关系的限制实体

Job :: one-to-many :: Restriction

因此,为了让您的真实世界的雄辩模型更清晰,请将job(machineproduct)实体添加到您的模型中。整个模型是这样的(有趣的是,它的核心是job/machineproduct实体。)

+-------------+     +------------+     +---------------+   
 |             |    /|            |\    |               |   
 |   Product   |-----|     Job    |-----|     Machine   |   
 |             |    \|            |/    |               |   
 +-------------+     +------------+     +---------------+   
                            |                                
                            |                               
                           /|\
                     +-------------+                        
                     |             |                        
                     | Restriction |                        
                     |             |                        
                     +-------------+

专业提示:在开始创建表之前,最好弄清楚您的实体和关系。
专业提示:如果您避免使用诸如 machine.id ,而使用 machine.machine_id . 这样你就可以在你的询问中这样说了

FROM Job j JOIN Machine m ON j.machine_id = m.machine_id

而不是

FROM Job j JOIN Machine m ON j.machine_id = m.id

不用想,等等,什么 id 是这样的,不要冒着犯错的风险:

FROM Job j JOIN Product p ON j.machine_id = p.id  /* wrong */

相关问题