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
表上插入触发器之前使用