Inheritance 外键关系与具体继承原则
在我的模式中,我有一个通用表Inheritance 外键关系与具体继承原则,inheritance,symfony1,doctrine,foreign-key-relationship,Inheritance,Symfony1,Doctrine,Foreign Key Relationship,在我的模式中,我有一个通用表Animal和一个继承表Dog。 在使用条令之前,我使用一个继承的id实现这个模式,该id引用通用id作为外键。 我不能复制同样的教义,我觉得有些东西缺失了 我用于生成的模式如下所示: CREATE TABLE `animal` ( `id` INT UNSIGNED NOT NULL AUTO_INCREMENT, `color` VARCHAR(20) NOT NULL, PRIMARY KEY (`id`) ); CREATE TABLE `dog
Animal
和一个继承表Dog
。
在使用条令之前,我使用一个继承的id实现这个模式,该id引用通用id作为外键。
我不能复制同样的教义,我觉得有些东西缺失了
我用于生成的模式如下所示:
CREATE TABLE `animal` (
`id` INT UNSIGNED NOT NULL AUTO_INCREMENT,
`color` VARCHAR(20) NOT NULL,
PRIMARY KEY (`id`)
);
CREATE TABLE `dog` (
`id` INT UNSIGNED NOT NULL,
`breed` VARCHAR(40) NOT NULL,
KEY `id` (`id`)
);
ALTER TABLE `dog` ADD CONSTRAINT FOREIGN KEY (`id`) REFERENCES `animal`(`id`);
我首先尝试使用具体继承原则,因为它似乎是这个问题的合乎逻辑的答案:
以下是YAML文件:
Animal:
columns:
id: { primary: true , type: integer , autoincrement: true }
color: { type: string(20) , notnull: true }
Dog:
columns:
breed: { type: string(20) , notnull: true }
inheritance:
extends: Animal
type: concrete
得到的SQL是:
CREATE TABLE `animal` (
`id` BIGINT NOT NULL AUTO_INCREMENT,
`color` VARCHAR(20) NOT NULL,
PRIMARY KEY (`id`)
);
CREATE TABLE IF NOT EXISTS `dog` (
`id` BIGINT NOT NULL AUTO_INCREMENT,
`color` VARCHAR(20) NOT NULL,
`breed` VARCHAR(20) NOT NULL,
PRIMARY KEY (`id`)
);
color
列的复制正常,但外键在哪里?如何确保我的dog.id
与我的animal.id
的完整性?如果我删除动物的行,会发生什么
因此,我尝试使用简单的一对一关联:
Animal:
columns:
id: { primary: true , type: integer(10) , autoincrement: true }
color: { type: string(20) , notnull: true }
Dog:
columns:
animal_id: { primary: true , type: integer(10) }
breed: { type: string(20) , notnull: true }
relations:
AnimalRecord:
class: Animal
foreignAlias: DogRecord
type: one
foreignType: one
local: animal_id
foreign: id
结果与上面相同(除了color
列没有重复,这是正常的,因为继承不再显式),仍然没有外键
如果我只是将animal\u id
从PRIMARY
更改为UNIQUE
,则外键将从dog.animal\u id
创建为animal.id
,但会出现一个新的自动递增id
它的行为就像是
主键
或外键
对某个列是独占的,我不明白为什么。此外,在我看来,这似乎是一个危险的缺陷。您可能需要重新阅读有关具体继承的文档:动物表将始终为空,因为在使用此继承策略类型时,您提供的关于狗“medor”的所有数据都将存储在狗表中。这就是为什么没有必要在动物和狗类之间建立关系
动物就像一个抽象的类,如果你愿意的话
在我看来,您的模式应该如下所示:
Animal:
columns:
id: { primary: true , type: integer(10) , autoincrement: true }
color: { type: string(20) , notnull: true }
Dog:
columns:
breed: { type: string(20) , notnull: true }
您可能需要重新阅读有关具体继承的文档:animal表将始终为空,因为在使用此继承策略类型时,您将提供的关于狗“medor”的所有数据都将存储在dog表中。这就是为什么没有必要在动物和狗类之间建立关系 动物就像一个抽象的类,如果你愿意的话 在我看来,您的模式应该如下所示:
Animal:
columns:
id: { primary: true , type: integer(10) , autoincrement: true }
color: { type: string(20) , notnull: true }
Dog:
columns:
breed: { type: string(20) , notnull: true }
很抱歉,我想文档中缺少一些信息。。。那么,自动增量是在继承的表之间共享还是独立?这种继承策略的意义是什么?@user750633:document文档确实缺少一些信息,这就是为什么您可能想要阅读感谢链接。。。我想我真的弄错了,因为我想使用继承在ID之间共享一个唯一的自动增量。不过,我认为我的主要问题仍然存在。即使没有继承,在理论上也可以将主键定义为外键吗?如果没有,有理论上的解释吗?@user750633:好问题,我没有线索。也许并非所有RDBMS都支持此功能?但我认为您应该将您的模式迁移到与其中一种学说的继承表示兼容的模式,以便在此之后您可以在代码中利用继承。但这并不容易。祝你好运,你的问题是+1。很抱歉,我想文档中缺少一些信息。。。那么,自动增量是在继承的表之间共享还是独立?这种继承策略的意义是什么?@user750633:document文档确实缺少一些信息,这就是为什么您可能想要阅读感谢链接。。。我想我真的弄错了,因为我想使用继承在ID之间共享一个唯一的自动增量。不过,我认为我的主要问题仍然存在。即使没有继承,在理论上也可以将主键定义为外键吗?如果没有,有理论上的解释吗?@user750633:好问题,我没有线索。也许并非所有RDBMS都支持此功能?但我认为您应该将您的模式迁移到与其中一种学说的继承表示兼容的模式,以便在此之后您可以在代码中利用继承。但这并不容易。祝你好运,你的问题是+1。为什么要在主键上添加约束?为什么要在主键上添加约束?