在Laravel中使用数据透视表中的id列(多对多关系)是否有任何优点(我使用的是5.1版本)?
带id
$table->increments('id');
$table->integer('appointment_id')->unsigned();
$table->foreign('appointment_id')->references('id')->on('appointments')->onDelete('cascade');
$table->integer('client_id')->unsigned();
$table->foreign('client_id')->references('id')->on('clients')->onDelete('cascade');
$table->timestamps();
没有id
$table->integer('appointment_id')->unsigned();
$table->foreign('appointment_id')->references('id')->on('appointments')->onDelete('cascade');
$table->integer('client_id')->unsigned();
$table->foreign('client_id')->references('id')->on('clients')->onDelete('cascade');
$table->timestamps();
答案 0 :(得分:5)
一般来说,答案是否定的,只要Laravel的Eloquent模型正在管理这种关系。
但是,如果你需要从Eloquent模型的外部访问这些表(比如,从另一个应用程序或在遥远的将来,当你重写你的应用程序以使用下一个大框架时),一个ID就会派上用场。 / p>
答案 1 :(得分:3)
最新答案,但是您可以删除自动递增id
,并将外键用作数据透视表的组合主键:
$table->integer('appointment_id')->unsigned();
$table->foreign('appointment_id')->
references('id')->on('appointments')->onDelete('cascade');
$table->integer('client_id')->unsigned();
$table->foreign('client_id')->
references('id')->on('clients')->onDelete('cascade');
// add the following instruction
$table->primary(['appointment_id', 'client_id']);
经过Laravel 5.6的测试,它可以在不中断Eloquent的管理的情况下,同时确保直接在数据库结构中关联的唯一性。
答案 2 :(得分:2)
在数据透视表上添加id作为主键时要小心,因为它会"中断"对外键关键字unicity的任何验证,这意味着您可以拥有多个具有相同外键对的记录。
答案 3 :(得分:1)
如果要设置MySQL组复制-必须在每个表上都有主键。
17.7.1组复制要求要用于组复制的服务器实例必须满足以下要求。
基础结构InnoDB存储引擎。数据必须存储在 InnoDB事务存储引擎。交易已执行 乐观地,然后在提交时检查冲突。如果 存在冲突,以便在整个过程中保持一致性 组中,一些事务将回滚。这意味着 事务存储引擎是必需的。而且,InnoDB提供 一些其他功能可以实现更好的管理和 与组复制一起操作时的冲突处理。
主键。该组要复制的每个表都必须 具有已定义的主键或等效的主键,其中 等效项是非null的唯一键。此类密钥是必需的 表格中每一行的唯一标识符,使系统能够 通过准确识别哪些交易来确定哪些交易发生冲突 每笔交易已修改的行。
IPv4网络。 MySQL Group使用的组通信引擎 复制仅支持IPv4。因此,组复制需要 一个IPv4网络基础结构。
网络性能。组复制旨在部署在 服务器实例与每个实例非常接近的集群环境 其他,并且受网络延迟和网络的影响 带宽。