Sql 通过多对多关系应用非空约束?
我需要确保数据库中的每个项目都有联系人。“项目”和“联系人”具有多对多关系,在“项目\联系人”表中指定。我是否可以在项目中创建一个表约束,以指定项目必须存在于联接表中?或者我需要采取完全不同的方法吗?Sql 通过多对多关系应用非空约束?,sql,postgresql,Sql,Postgresql,我需要确保数据库中的每个项目都有联系人。“项目”和“联系人”具有多对多关系,在“项目\联系人”表中指定。我是否可以在项目中创建一个表约束,以指定项目必须存在于联接表中?或者我需要采取完全不同的方法吗? (我需要用户能够在添加项目数据的过程中手动输入联系人数据,因此我担心NoLnull将在建立接触之前挂起他们创建项目的能力。) 在构建用户界面时,这一点会得到更好的解决吗 谢谢 CREATE TABLE projects( id_project INTEGER PRIMARY KEY, descri
(我需要用户能够在添加项目数据的过程中手动输入联系人数据,因此我担心NoLnull将在建立接触之前挂起他们创建项目的能力。) 在构建用户界面时,这一点会得到更好的解决吗 谢谢
CREATE TABLE projects(
id_project INTEGER PRIMARY KEY,
description text)
CREATE TABLE contacts(
id_contact integer PRIMARY KEY
firstname varchar(100) )
CREATE TABLE projects_contacts(
id_projects_contacts integer PRIMARY KEY,>
id_project integer,
id_contact integer
CONSTRAINT FOREIGN KEY project_fkey (id_project) REFERENCES projects ON UPDATE CASCADE ON DELETE CASCADE
CONSTRAINT FOREIGN KEY contact_fkey (id_contact) REFERENCES contacts ON UPDATE CASCADE ON DELETE CASCADE)
使用表级约束实现此功能的唯一方法是
projects
包含对projects\u contacts
中任何条目的不可为空外键引用。
但这将是一个循环引用,因为projects\u联系人也依赖于“projects”
您说过您不想在用户仍在创建项目时强制用户输入联系人,因此基本上您不能用不可为空的引用来约束项目
没有任何约束意味着“我需要它不为null,但稍后才为。”在任何约束的定义中,在结束事务时必须满足该约束
因此,您最多可以将约束延迟到提交:
我假设您需要的延迟时间比一笔交易的时间长
因此,这些类型的自定义业务规则最终由您必须开发的应用程序代码强制执行。如果必须在项目中包含联系人,则GUI不应发送添加请求,除非联系人数据(或密钥,如果已经存在)是事务的一部分
这样,您就不需要FK来允许空值
但是,从业务的角度来看,如果联系人不再是项目的联系人,并且没有指定替代联系人,您会怎么做
在这种情况下,您的企业应该做出决定。如果是这样,FK必须在更新时允许空值
要结合这两种情况,您的FK应允许空值,但您的业务层不应接受带有空值的create project transaction contact FK
您还需要考虑这个业务问题:没有项目,联系人是否可以存在?答案在GUI设计中很重要
根据您的声明“我需要用户能够在添加项目数据的中间手动输入联系人数据”这对我来说只有当联系人将被直接添加到当前项目时才是有意义的,但是如果用户开始创建项目、创建联系人然后放弃创建项目的过程该怎么办?您如何识别添加的联系人?因此,您可能希望细化此要求。
对于通过web访问数据库的用户,每次添加一个项目,我将使用Bill的提示:“因此,您最多可以将约束推迟到提交:”对于需要一次添加一个项目或导入大数据集的管理员,我必须仔细考虑是否需要在projects\u contacts连接表中设置一个NOT NULL约束。使用NOT NULL约束,管理员将无法选择将数据交叉传送到我们的数据库中。但是,如果没有NOTNULL约束,管理员将需要知道在人行横道之后,是否所有项目都有联系人(并且没有项目的联系人)。或我可以为他们写一个脚本来运行检查?