2

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

IE。

表A(援助int PK)

表B(投标整数PK)

表AB(Aid int,Bid int,ABID int PK ??????)

谢谢

4

1 回答 1

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");
于 2013-03-20T01:08:28.637 回答