2015-05-01 21 views
1

对于一个项目,我创建了一个数据库模型,并且我不完全确定我是否在正确的道路上。我试图找到答案,但空了。如何定义其中一个是主键的两列之间的关系?

我有两个表。其中一个是另一个的“子类”。例如:AnimalHorseHorse有一个名为HorseId的主键,而Animal有一个名为AnimalId的主键。 HorseId是涉及AnimalId的外键。到现在为止还挺好。

现在我想添加一列TypeAnimal表,所以我知道它是哪个动物。 Animal现在有AnimalIdType作为列。

表动物

AnimalId (PK) 
Type 

表马

HorseId (PK, FK ref Animal.AnimalId) 

然而,标识的马应该始终有 '马' 为TypeAnimalId。一种可能性是将Type作为主键的一部分,但这看起来不正确,因为AnimalId唯一标识了其中的一行。

另一种选择是创建包含两列的备用密钥。但是,我的验证器告诉我'主键是备用键的一个子集'(这是正确的),并且警告我。不允许吗?

我应该如何解决这个问题?

在此先感谢!

+0

您是否试图创建一个规则,如果Animal表中存在AnimalID,则强制Type为Horse? – mucio

+0

如果可能的话,这将解决所有问题。 我在第一篇文章中说的只是解决部分问题。它确保AnimalId只能有一个类型。您真正想要的是确保类型与Id所在的表相同。 但是,我不确定是否要在数据库级别制作这样的约束。如果我能做第一部分,我也会很开心。解决方案中的 – Century

+0

将会是一个触发器,当您在'Animal'中用'Type = Horse'插入记录时,在'Horse'中插入一个新行。你正在使用哪个数据库? – mucio

回答

0

使用触发器解决了多个问题。 我不得不改变外键关系,因为它被定义为错误的方式。 AnimalId应参考HorseId如果我想能够在Horse中创建新记录。
此外,替代密钥不是必需的。主键和外键已确保Animal内的记录引用Horse中的一条记录,因此总是会有一条记录Type
为了确保TypeAnimal是正确的,我已经能够创建一个触发器。在插入了Horse中的记录后,触发器会自动将一条记录插入到Animal中,记录正确的为TypeId。 触发器和主键Animal确保没有人可以直接输入Animal并插入错误的Type

触发如下:

CREATE trigger Trigger 
ON Horse 
AFTER INSERT 
AS 
DECLARE @Id uniqueidentifier 
SET @Id = (SELECT HorseId FROM inserted) 
INSERT Animal VALUES (@Id, 'Horse') 

感谢您指出我在正确的方向!

相关问题