SQL Server的外键到多个表(SQL Server foreign key to multip

2019-08-21 12:55发布

我有以下的数据库模式:

members_company1(id, name, ...);
members_company2(id, name, ...);
profiles(memberid, membertypeid, ...);
membertypes(id, name, ...)
[ 
       { id : 1, name : 'company1', ... }, 
       { id : 2, name : 'company2', ... }
];

因此,每个简档属于某个构件无论是从公司1或Company2的取决于membertypeid

members_company1     —————————      members_company2     
————————————————                    ————————————————
id      ——————————> memberid <———————————         id
name               membertypeid                 name
                       /|\
                        |  
                        |  
      profiles          |  
      ——————————        |  
      memberid  ————————+  
      membertypeid

我想知道是否有可能创建一个外键profiles表引用完整性基于memberidmembertypeid对引用要么members_company1或members_company2表中的记录?

Answer 1:

外键只能引用一个表,如邮件中注明文档 (重点煤矿):

外键(FK)是一个列或用于建立和在两个表执行数据之间的链接列的组合。

但是,如果你想开始清理东西,你可以创建一个members表作为@KevinCrowell建议,从两个填充它members_company表和享有替换它们。 您可以使用INSTEAD OF上的意见触发器“重定向”更新到新表。 这仍然是一些工作,但它会解决您的数据模型,在不破坏现有的应用程序的一种方式(如果它是可行的,您的情况,当然)



Answer 2:

事实上,你不能改变表结构下运行:

选项1

重要的是如何引用完整性你? 这些表之间的你只是做内部联接? 如果您不必过分担心它,再也不担心。

选项2

好吧,你可能要为此做些什么 。 也许你们只有内部连接,但你必须应对规范的数据不涉及到任何的成员表。 您可以创建每天或每周运行一次,以清理出来工作?

选项3

是啊,一个也无法使用。 你可以创建配置文件表检查参照成员表中的触发器。 这是很不理想,但它确实保证瞬时检查。

我的看法

我会选择去2.你显然有低于理想的模式处理。 为什么让这个不如它必须是。 让坏的数据坐了一个星期; 擦桌子每个周末。



Answer 3:

来吧,你可以创建一个表,但不能修改members_company1也不members_company2?

你一个创建成员表的想法,需要时新的记录被插入到表members_company多个动作。
所以,你可以创建members_company1和members_company2触发器 - 这是不能修改?

什么是约束你可以做什么?

如果您只是需要选择兼容性members_company1和members_company2然后创建一个真正的成员表和创建视图的members_company1和members_company2。
一个基本的选择不知道它是一个视图或在另一端的表。

CREATE VIEW dbo.members_company1
AS
SELECT id, name 
FROM members
where companyID = 1

你可以甚至可以插入处理,更新,并与INSTEAD-OF删除

INSTEAD OF触发器INSERT



Answer 4:

号外键可以引用一个且只有一个主键,也没有办法跨表传播的主键。 让所有成员都基于在一个表中的核心记录你希望达到的一种逻辑,将需要使用触发器或重组你的数据库。



Answer 5:

外键不能引用两个表。 假设你不想纠正合并设计members_company1members_company2表,最好的办法是:

两列名为添加member_company1_idmember_company2_id到您的profiles表,并创建两个外键的两个表,并允许nulls 。 然后,你可以添加一个约束,以确保列1是null ,另一种是没有,在任何时候。



文章来源: SQL Server foreign key to multiple tables