代码之家  ›  专栏  ›  技术社区  ›  Aaron Powell

单个列有多个外键

  •  25
  • Aaron Powell  · 技术社区  · 17 年前

    但他们的订单格式相同。有可能有一个 CustomerId 创建 关系,但我还没有尝试插入任何数据。

    此外,我计划使用nHibernate作为ORM,这样做会带来什么问题吗?

    8 回复  |  直到 17 年前
        1
  •  24
  •   Guffa    17 年前

    不,您不能将单个字段作为两个不同表的外键。你怎么知道在哪里找钥匙?

    您至少需要一个字段来告诉它是什么类型的用户,或者两个单独的外键。

    您还可以将所有用户通用的信息放在一个表中,并为特定于用户类型的信息设置单独的表,这样您就有一个以用户id为主键的表。

        2
  •  4
  •   Marc Gravell    17 年前

    CustomerA <---- CustomerA_Orders ----> Order
    CustomerB <---- CustomerB_Orders ----> Order
    

    所以订单甚至没有

        3
  •  1
  •   Raj    17 年前

    我继承了一个SQL Server数据库,在那里完成了这项工作(在四个外键关系和四个不相关的表中使用了一列),所以是的,这是可能的。不过,我的前任已经走了,所以我不能问他为什么认为这是一个好主意。

    他使用GUID列(“uniqueidentifier”类型)来避免歧义问题,并关闭了对外键的约束检查,因为可以保证只有一个匹配。但我能想到很多你不应该的理由,我还没有想到任何你应该的理由。

    你的听起来确实像是经典的“专业化”问题,通常通过创建一个包含共享客户数据的父表,然后创建两个子表来解决,这两个子表包含每类客户独有的数据。然后,您的外键将与父客户表相对,您对哪种客户类型的确定将基于哪个子表有匹配的条目。

        4
  •  1
  •   Dave G.    11 年前

    您可以创建引用多个表的外键。此功能允许表的垂直分割,同时保持引用完整性。然而,就你的情况而言,这并不适用。

    拉吉

        5
  •  0
  •   Jay    17 年前

    我知道这是一个非常古老的问题;然而,如果其他人通过谷歌搜索发现了这个问题,而你不介意在表格中添加一些列,我使用的一种技术(将原始问题作为假设问题来解决)是:

    1. 添加[客户类型]列。在此处存储值的目的是指示哪个表包含(假定的)[CustomerId]FK列的PK。可选-添加检查约束(以确保CustomerType在CustomerA或CustomerB中)将帮助您在晚上睡得更好。

    2. 为每个[客户类型]添加一个计算列,例如:
      [CustomerTypeAId] as case when [CustomerType] = 'CustomerA' then [CustomerId] end persisted
      [CustomerTypeBId] as case when [CustomerType] = 'CustomerB' then [CustomerId] end persisted

        6
  •  0
  •   Community Mohan Dere    9 年前

    如前所述,如果键是12345,您如何知道在哪个表中查找它?我想,你可以做点什么来确保两个表的键值永远不会重叠,但这太丑陋和痛苦了。您可以有第二个字段,说明它是哪种客户类型。但是,如果您要有两个字段,为什么不为客户类型1 id设置一个字段,为客户类型2 id设置另一个字段。

    在不了解更多关于你的应用程序的情况下,我的第一个想法是,你真的应该有一个通用的客户表,其中包含两者共有的数据,然后有两个额外的表,其中分别包含每种客户类型的数据。我认为这两者必须有很多共同的数据——至少是姓名、地址和客户号等基本数据——而且跨表重复列会浪费很多时间。然后,附加表可以引用回基表。由于基表只有一个键,因此外键必须知道引用哪个表的问题就不复存在了。

        7
  •  -1
  •   Anand    11 年前

    两种不同类型的客户是典型的类型和子类型,或者,如果你愿意,是类和子类。 Here 这是另一个问题的答案。

    本质上,类表继承技术类似于Arnand的答案。使用共享主键技术可以解决一列中两种类型的外键所造成的问题。外键将是客户id。这将标识客户表中的一行,以及适当类型的客户类型表中的另一行,具体视情况而定。