我正在考虑创建一个应用程序来管理我正在为其工作的公司和其他组织签署的协议。
为此,我创建了以下EER图:http://i.stack.imgur.com/kbLIi.png
为了有效,公约必须包括签署人(表CONVENTION中的organization_signatory)和联系人(表CONVENTION中的organization_contact)。
所以我的问题是:我如何确保这两个人属于同一家公司?
答案 0 :(得分:0)
您必须添加约束。约定organization_contact值显示为具有某个组织值的Organization_staff id。公约organization_signatory值显示为具有某个组织值的Organization_staff id。您希望这两个组织值相同。
-- Convention(id,...)
fk (organization_contact) references Organization_staff (id)
fk (organization_signatory) references Organization_staff (id)
-- standard SQL but seldom supported
check (
(select id from Convention c JOIN Organization_staff s
where c.id = s.organization_contact)
= (select id from Convention c JOIN Organization_staff s
where c.id = s.organization_signatory))
您不会说出您正在使用的工具,因此我们无法知道如何在其中表达这些工具。建模产品和SQL DBMS不支持任意ASSERTION或CHECK约束。 Re SQL技术见Applied Mathematics for Database Professionals。您可以在stackoverflow中搜索ASSERTION和CHECK约束的替代方法。
然而,一项公约与某一特定组织相关联似乎是合理的:组织其联系人及其签字人。
fk (organization) references Organization (id)
fk (organization_contact,organization) references Organization_staff (id, organization)
fk (organization_signatory,organization) references Organization_staff (id, organization)
SQL要求您在Organization_staff中声明(逻辑冗余地)FK目标:
unique (id, organization)
但是你可以在公约中宣布组织只是为了使联系和签字组织约束容易以声明方式表达。为了这样的目的,人们在SQL中使用这样的习语。