Database design 如何定义其中一列为主键的两列之间的关系?

Database design 如何定义其中一列为主键的两列之间的关系?,database-design,Database Design,对于一个项目,我正在创建一个数据库模型,我不能完全确定我是否走上了正确的道路。我试图找到答案,但没有找到 我有两张桌子。其中一个是另一个的“子类” 示例:动物和马Horse有一个主键名为HorseId,Animal有一个主键名为AnimalIdHorseId是引用AnimalId的外键。到目前为止还不错 现在我想在Animal表中添加一列Type,这样我就知道它是哪种动物了Animal现在有AnimalId和Type作为一列 餐桌动物 AnimalId (PK) Type HorseI

对于一个项目,我正在创建一个数据库模型,我不能完全确定我是否走上了正确的道路。我试图找到答案,但没有找到

我有两张桌子。其中一个是另一个的“子类”

示例:
动物
Horse
有一个主键名为
HorseId
Animal
有一个主键名为
AnimalId
HorseId
是引用
AnimalId
的外键。到目前为止还不错

现在我想在
Animal
表中添加一列
Type
,这样我就知道它是哪种动物了
Animal
现在有
AnimalId
Type
作为一列

餐桌动物

AnimalId (PK)  
Type  
HorseId (PK, FK ref Animal.AnimalId)
桌上马

AnimalId (PK)  
Type  
HorseId (PK, FK ref Animal.AnimalId)
但是,标识马的
AnimalId
应该始终将“horse”作为
类型
。一种可能是将
Type
作为主键的一部分,但这似乎并不正确,因为
AnimalId
在主键上唯一地标识一行

另一个选项是创建一个包含这两列的备用键。然而,我的验证器告诉我‘主键是备用键的子集’(这是正确的),并警告我这一点。这是不允许的吗

我应该如何解决这个问题


提前谢谢

使用触发器解决了多个问题。 我必须更改外键关系,因为它被定义为错误的方式<如果我想在
Horse
中创建新记录,code>AnimalId应该引用
HorseId
此外,不需要备用密钥。主键和外键已经确保
动物
中的记录引用了
中的一条记录,因此将始终有一条
类型

为了确保
动物
中的
类型
正确,我已经能够创建一个触发器。插入
中的记录后,触发器会自动以正确的
类型和
Id将记录插入
动物
Animal
的触发器和主键确保任何人都不能直接在
Animal
中输入行并插入错误的
类型

触发条件如下:

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

谢谢你给我指明了正确的方向

如果马表中存在动物,您是否试图创建一个强制类型为马的规则?如果可能,这将解决所有问题。我在第一篇文章中所说的只是解决问题的一部分。它确保动物只能有一种类型。您真正想要的是确保类型与Id所在的表相同。但是,我不确定您是否希望在数据库级别上进行这样的约束。如果我能做第一部分,我也会很高兴。解决方案是,当您使用
Type=Horse
Animal
中插入记录时,在
Horse
中插入新行。您使用的是哪个数据库?我认为是另一种情况,当为Horse创建新记录(将有更多列)时,它将向Animal表中添加一行,Type=Horse。你能自动完成吗?如果你能阻止任何人直接在动物身上插入一行,那么问题就解决了。可能吗?我使用的是SQuirrel SQL数据库。我不确定它是否有效(因为
AnimalID
Horse
的FK),但您可以在
Horse
表上插入触发器之前使用