我有两张桌子:
People
:
Id | OrgId | Name
-----------------
1 10 Sam
2 10 Dana
3 12 Max
Id
是主键。 OrgId
是其他表的外键。
第二张表Cars
:
Id | Name | OrgId | PersonId
----------------------------
1 Volvo 10 1
2 BMW 10 2
此处:Id
是主键。 PersonId
是People
表的外键。 OrgId
是Organization
表的外键。
所以我Person
已附加到Organization
,Cars
附加到Organization
和Person
。
我需要保证无法将Car
从Organization
附加到Person
而从另一个Organization
附加Id | Name | OrgId | PersonId
----------------------------
1 Volvo 12 1
。记录:
Car
必须是不可能的,因为Organization
属于ID
且Person
= 12,但Organization
属于ID
且People
= 10。
最好的方法是什么?
我看到两种方式:
Id
(OrgId
+ Cars
)< - > PersonId
(OrgId
+ People
)。但在这种情况下,我需要在表+
上创建一个额外的唯一索引(' Id Cars
OrgId`)。
class Functor (f :: * -> *) where
fmap :: (a -> b) -> f a -> f b
。 在这种情况下,您建议使用什么?
答案 0 :(得分:2)
我的第一反应是使用person列查找组织。但是,这并不适合这种情况 - 汽车是由独立于人的组织所拥有的。因此,即使没有人员,也可能需要组织。
因此,请向people
添加新密钥:
alter table people add constraint unq_people_orgid_id unique (orgid, id);
然后将其用于cars
中的外键引用:
alter table cars add constraint
foreign key (orgid, personid) references people(orgid, id);
请注意,第二个密钥 是多余的。但它允许包含组织的参考。
答案 1 :(得分:0)
我不会在你的汽车表中使用OrgId,它违反了规范化规则。您可以使用查询来使用PersonId获取汽车的组织信息。