我有以下的数据库模式:
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
表引用完整性基于memberid
和membertypeid
对引用要么members_company1或members_company2表中的记录?
外键只能引用一个表,如邮件中注明文档 (重点煤矿):
外键(FK)是一个列或用于建立和在两个表执行数据之间的链接列的组合。
但是,如果你想开始清理东西,你可以创建一个members
表作为@KevinCrowell建议,从两个填充它members_company
表和享有替换它们。 您可以使用INSTEAD OF
上的意见触发器“重定向”更新到新表。 这仍然是一些工作,但它会解决您的数据模型,在不破坏现有的应用程序的一种方式(如果它是可行的,您的情况,当然)
事实上,你不能改变表结构下运行:
选项1
重要的是如何引用完整性你? 这些表之间的你只是做内部联接? 如果您不必过分担心它,再也不担心。
选项2
好吧,你可能要为此做些什么 。 也许你们只有内部连接,但你必须应对规范的数据不涉及到任何的成员表。 您可以创建每天或每周运行一次,以清理出来工作?
选项3
是啊,一个也无法使用。 你可以创建配置文件表检查参照成员表中的触发器。 这是很不理想,但它确实保证瞬时检查。
我的看法
我会选择去2.你显然有低于理想的模式处理。 为什么让这个不如它必须是。 让坏的数据坐了一个星期; 擦桌子每个周末。
来吧,你可以创建一个表,但不能修改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
号外键可以引用一个且只有一个主键,也没有办法跨表传播的主键。 让所有成员都基于在一个表中的核心记录你希望达到的一种逻辑,将需要使用触发器或重组你的数据库。
外键不能引用两个表。 假设你不想纠正合并设计members_company1
和members_company2
表,最好的办法是:
两列名为添加member_company1_id
和member_company2_id
到您的profiles
表,并创建两个外键的两个表,并允许nulls
。 然后,你可以添加一个约束,以确保列1是null
,另一种是没有,在任何时候。