在Laravel中将id列添加到数据透视表的任何优点?

时间:2015-12-14 19:24:36

标签: laravel laravel-4 laravel-5

在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();

4 个答案:

答案 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的管理的情况下,同时确保直接在数据库结构中关联的唯一性。

More about creating indexes...

答案 2 :(得分:2)

在数据透视表上添加id作为主键时要小心,因为它会"中断"对外键关键字unicity的任何验证,这意味着您可以拥有多个具有相同外键对的记录。

答案 3 :(得分:1)

如果要设置MySQL组复制-必须在每个表上都有主键。

  

17.7.1组复制要求要用于组复制的服务器实例必须满足以下要求。

     

基础结构InnoDB存储引擎。数据必须存储在   InnoDB事务存储引擎。交易已执行   乐观地,然后在提交时检查冲突。如果   存在冲突,以便在整个过程中保持一致性   组中,一些事务将回滚。这意味着   事务存储引擎是必需的。而且,InnoDB提供   一些其他功能可以实现更好的管理和   与组复制一起操作时的冲突处理。

     

主键。该组要复制的每个表都必须   具有已定义的主键或等效的主键,其中   等效项是非null的唯一键。此类密钥是必需的   表格中每一行的唯一标识符,使系统能够   通过准确识别哪些交易来确定哪些交易发生冲突   每笔交易已修改的行。

     

IPv4网络。 MySQL Group使用的组通信引擎   复制仅支持IPv4。因此,组复制需要   一个IPv4网络基础结构。

     

网络性能。组复制旨在部署在   服务器实例与每个实例非常接近的集群环境   其他,并且受网络延迟和网络的影响   带宽。