是否正确规范了多对多关系中的主键?

时间:2013-01-28 20:42:47

标签: sql relation 3nf

我有一个多对多的表(TableAB),它只是持有表A的外键和表B的外键。总觉得我还应该向表本身添加一个主键列,这就是什么我通常会这样做。但从学术角度来看,这是否违反了2nf,3nf,BCNF规则中的任何规定?它没有添加任何真正的唯一性,并且创建了一个表,其中我有一个主键和一个单独的复合主键,虽然它们没有重叠,但是当我的M2M表被其他表引用时确实使关系更容易解决,但感兴趣听取学者的意见。

即。

表A (援助PK)

表B (Bid int PK)

TableAB (援助int,   出价int,   ABID int PK ?????? )

感谢

1 个答案:

答案 0 :(得分:1)

从RDBMS理论的角度来看,您将在TableAB上拥有一个复合主键。

实施例

CREATE TABLE IF NOT EXISTS `TableAB` (
  `A_id` int(11) NOT NULL,
  `B_id` int(11) NOT NULL,
  PRIMARY KEY (`A_id`,`B_id`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1;

需要单独的主键来自与RDBMS一起使用的软件需求。某些Microsoft工具不允许更新主键,因此必须删除并添加行才能对其进行修改。拥有单独的主键可以更轻松地更新关系。

在按惯例编码的世界中,像CakePhp或Rails类似的框架期望名为ID的列成为表的主键。 http://guides.rubyonrails.org/association_basics.html#the-has_and_belongs_to_many-association

Yii php框架允许复合主键,因此我们可以将表定义为

$this->createTable('course_student', array(
    'course_id' => 'INT NOT NULL',
    'student_id' => 'INT NOT NULL',
    'PRIMARY KEY (`course_id`,`student_id`)',
        ), 'ENGINE=InnoDB');
$this->addForeignKey("fk_cs_course", "course_student", "course_id", "course", "id", "CASCADE", "RESTRICT");
$this->addForeignKey("fk_cs_student", "course_student", "student_id", "student", "id", "CASCADE", "RESTRICT");