6

我有以下数据库架构:

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

因此,每个配置文件都属于来自 company1 或 company2 的某个成员,具体取决于membertypeid

members_company1     —————————      members_company2     
————————————————                    ————————————————
id      ——————————&gt; memberid <———————————         id
name               membertypeid                 name
                       /|\
                        |  
                        |  
      profiles          |  
      ——————————        |  
      memberid  ————————+  
      membertypeid

我想知道是否可以在profiles表中创建一个外键以实现参照完整性,memberidmembertypeid配对以引用 members_company1 或 members_company2 表记录?

4

5 回答 5

4

如文档中所述(强调我的),外键只能引用一个表:

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

但是,如果您想开始清理工作,您可以members按照@KevinCrowell 的建议创建一个表,从两个members_company表中填充它并用视图替换它们。您可以使用INSTEAD OF视图上的触发器将更新“重定向”到新表。这仍然是一些工作,但这将是在不破坏现有应用程序的情况下修复数据模型的一种方法(当然,如果在您的情况下可行)

于 2013-04-11T14:33:18.220 回答
1

在不能改变表结构的情况下操作:

选项1

引用完整性对您来说有多重要?您是否只在这些表之间进行内部连接?如果您不必为此担心太多,那就不要担心。

选项 2

好的,您可能必须对此做点什么。也许您确实只有内部联接,但您必须处理与成员表中的任何内容无关的配置文件中的数据。你能创建一个每天或每周运行一次的作业来清理它吗?

选项 3

是的,那个也可能行不通。您可以在配置文件表上创建一个触发器来检查对成员表的引用。这远非理想,但它确实保证了即时检查。

我的意见

我会选择选项 2。您显然正在处理一个不太理想的模式。为什么要让事情变得更糟。让不良数据搁置一周;每个周末打扫桌子。

于 2013-04-10T21:06:35.110 回答
1

来吧,你可以创建一个表,但你不能修改 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 INSERT 触发器

于 2013-04-10T21:48:48.637 回答
0

不可以。外键只能引用一个主键,并且无法跨表传播主键。您希望实现的逻辑将需要使用触发器或重组您的数据库,以便所有成员都基于单个表中的核心记录。

于 2013-04-10T21:22:02.933 回答
0

外键不能引用两个表。假设您不想通过合并members_company1members_company2表格来更正您的设计,最好的方法是:

将名为member_company1_idand的两列添加member_company2_id到您的profiles表中,并为这两个表创建两个外键并允许nulls。然后,您可以添加一个约束以确保其中一列始终存在null,而另一列始终不存在。

于 2013-04-10T21:15:40.627 回答