代码之家  ›  专栏  ›  技术社区  ›  Rachel

数据库设计-如何将FK关系设置为2个表中的1个?

  •  0
  • Rachel  · 技术社区  · 14 年前

    在多个数据库表中维护唯一ID字段的最佳方法是什么?

    我的数据库包含企业和人员,两个实体都需要有一个与之关联的唯一ID字段。此外,还有其他表(例如地址)可以引用使用其ID作为外键的企业或个人。

    我想到的一些想法是:

    • 使用插入行时计算的非自动编号ID字段。这可以解决我的唯一性问题,但是每当我想通过相关属性(例如通过地址)查找某个内容时,我都必须检查两个表,其中一个表包含我要查找的记录。

    • 在“自动编号ID”中添加前缀以标识要在哪个表中查找ID,但是,关联表中的“我的ID”字段可能会成为字符串或包含与其关联的表的标志,我不确定这将如何影响性能。

    • 将人员和企业合并到一个表中。我的问题是,人和企业有不同的属性,需要单独的字段,这违背了我的本性,因为我更喜欢为单独的实体提供单独的表。

    • 创建一个主表,其中包含一个唯一的ID字段、人员或业务的ID字段,以及一个标志,用于说明它是哪个主表。然后将该ID用作外部引用以及所有相关表中的引用。

    • 一些更好的处理方法,因为我不是DBA,所以我不知道。

    无论采用哪种解决方案,我都需要能够轻松地处理大量的记录(要替换的数据库有数百万条记录),并且在MS SQL Server上

    8 回复  |  直到 14 年前
        1
  •  6
  •   HLGEM    14 年前

    好吧,你不能用那个设置设置设置外键。一个外键不能引用两个可能不同的表。

    我将执行以下操作之一:

    当然,您可以在地址表中使用两个单独的列来表示两个实体中的每一个。BusinessID和PeopleID。fks可以有空值,所以这是可以的。然后,您可以实施FK关系,这将防止您出现数据完整性问题。

    或者设置一个父表,其中包含企业和人员,但字段很少(只有他们真正具有的共同点,甚至可能只有唯一的ID和记录类型),然后您可以为企业、人员、地址等创建子表。

    或者设置单独的子表——业务地址、业务地址、人员和人员地址等,这样就不需要在两个逻辑实体之间保持ID的唯一性。

    我忘记了一个可能性,如果你有很多对很多的关系,你可以有地址,业务,人员,然后一些链接表,业务地址,人员服装。 如果我有其他选择的话,我个人不会使用guid,因为它们会损害性能。

        2
  •  2
  •   Jim L    14 年前

    你也可以改变你的想法。

    不是让地址具有个人或企业ID,而是让个人或企业具有地址ID。

    在我的书中,这是一种更自然的思考方式…一个人有一个地址。

        3
  •  1
  •   Frank Schwieterman    14 年前

    这就是guid的作用。

        4
  •  1
  •   Paul    14 年前

    有几种不同的模式可以做到这一点,但最简单和最灵活的模式是使用唯一标识符(guid);大多数dbs都有一些构建这些标识符的工具(例如,SQL Server是newid())。他们比其他身份证要大,但他们会帮你完成你要找的工作。

        5
  •  1
  •   MJB    14 年前

    有些数据库允许您使用具有空值的外键。有些没有,我想不起来SQL Server是否有。如果您的允许,地址表中可以有两个ID列,一个指向人员,一个指向企业。这种方法也有优点和缺点;缺点之一是DBA可能不喜欢它,但是如果数据库允许,那么它可能是一种替代方法。

        6
  •  1
  •   nvogel    14 年前

    创建一个“父类型”表,该表标识企业和人员,并用您的外键引用该表。这是这种情况的一种常见模式。见: Party Data Model .

        7
  •  0
  •   Francesca    14 年前

    guid是唯一的标识符,其他的都不行。
    guid的问题在于它的大小,特别是如果你的数据库很大的话。
    它们不应用于联接(索引、外键…)。
    我们有一个精确的数据库设计,当记录数量太大时,我们必须将其改回整数。
    我也会指出,您需要小心为您的个人/企业/地址设计。这是一种多对多的关系。一个企业/个人可以有一个以上的地址,一个地址可以有多个企业/个人…

    如果你想把生意和人分开,你可以有两张桌子 人物地址 营业地址 保持关系和 当你查找两个地址的时候,你必须做一个联合。 或者你可以 单个表的EntityAddress 对于两个企业,一个人在一起 具有实体自然场 告诉你是生意还是人。

        8
  •  0
  •   Erwin Smout    14 年前

    生意人和人真的,完全,独立于生意?

    他们没有什么共同点,即使不是“他们出生的那天”?

    企业不把这两者都视为“交易对手”?

    我想说明的是,如果你不戴一般IT(所谓的“专业人士”)通常会看穿的那种通常会让人眼花缭乱的眼镜,那么你很快就会发现你在寻找的共性。

    在数据库中定义一个表来记录这些共性(即使它只是标识),并使地址引用该表。