sql-server – 在SQL数据库上实施“零或一对一”关系?
我有一个Post实体和一个FbPost实体. Post.FbPost为null或FbPost,而且没有两个Post实体可以引用沟通的FbPost实体.换句话说,零或一对一. 在SQL Server中(抱负环境下)将此实现为零或一对一而不是多对一的正确要领是什么? 假如那是不行能的,我该如安在EF级别逼迫执行此操纵? 办理要领凡是,您也许会实行将外键(在源表中)置为可空并在其上安排独一束缚.它可觉得空的究竟意味着您可以在源表中有一个空条目,该条目不引用方针表中的条目.而且,假如它不为null,则独一束缚确保源表中只有一行可以引用方针表中的行. 不幸的是,至少在SQL Server(a)中,独一束缚列中的NULL也必需是独一的,尽量这会“粉碎”SQL指南,即NULL不便是任何值,包罗另一个NULL.以是根基上,这种要领不合用于SQL Server. 挣脱这个困境(b)的一种也许要领是具有可空列的外键束缚,但没有独一束缚.这将应承您确保您基础不引用方针表中的行(源表中的NULL)或引用方针行(源表中的任何非NULL值). 可是,它不会为您提供“只有一个源行可以引用方针行”的要求.这可以添加一个before-(插入/更新)触发器,该触发器将搜查源表中的每隔一行以确保没有其他行已经引用方针行. 并且你险些老是喜好数据库自己的束缚.您永久不知道恶意应用措施(恶意或错误)何时毗连到您的数据库并抉择不遵遵法则. (a)从here开始的以下文本表现了对几个DBMS产物中可为空的独一列的差异支持: 尺度: 如束缚名称所示,具有UNIQUE束缚的(一组)列也许仅包括独一(组合)值. 除非DBMS实现可选的“应承NULL”成果(成果ID 591),不然受UNIQUE束缚束缚的列或一组列也必需遵循NOT NULL束缚.可选成果为UNIQUE束缚添加了一些特另外特征: 起首,UNIQUE束缚中涉及的列也也许具有NOT NULL束缚,但它们不必具有.其次,假如具有UNIQUE束缚的列也不具有NOT NULL束缚,则列可以包括恣意数目的NULL’值'(NULL不便是NULL的逻辑功效). PostgreSQL的: 遵循尺度,包罗可选的NULL应承成果. DB2: 遵循UNIQUE束缚的非可选部门.不实现可选的NULL应承成果. MSSQL: 跟从尺度扭曲. MSSQL提供应承NULL的成果,但假如应承NULL,则应承最多一个NULL’值’实例.换句话说,它粉碎了尺度的上述描写中的特性2. MySQL的: 遵循尺度,包罗可选的NULL应承成果. 甲骨文: 遵循有关多列UNIQUE束缚的尺度. 实现了可选的NULL应承成果:假如对单个列施加UNIQUE束缚,则该列可以包括恣意数目的NULL(如上面尺度描写中的特性2所预期的那样).可是,假如为多个列指定了UNIQUE束缚,那么Oracle会将束缚视为违背任何两行 >在受束缚影响的列中包括至少一个NULL (b)另一种要领虽然是选择实现此成果的DBMS,如PostgreSQL或MySQL. 在您的详细环境下,这也许是不行能的,但至少应思量到它.譬喻,我避开Oracle,由于它无法从某些字符列中的空字符串平分辨NULL,尽量其他人也许不像我那样“纯粹主义”(我的老婆会说“肛门保持”):-) (编辑:湖南网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |