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