数据库设计,表模拟多个表的外键

时间:2012-05-21 18:56:51

标签: sql sql-server database-design foreign-keys ddl

我正在尝试解决问题,并且很难找到最佳解决方案。我有一个数据库,其中包含(除其他外)一个表格,用于以下事项:

  • 目的地申请
  • 支持请求
  • 交换请求
  • 存款申请

这些表中的每一个都有一个注释列(从最终用户到管理员),但是我被要求添加为所有这些请求添加注释的功能。我希望每组笔记都是独立的,这样我就可以跟踪添加笔记的日期/时间,以及编辑它的人。这告诉我,我需要将笔记存储在表中,并通过外键链接回请求。问题是每个请求表都有一个自动递增的id列,该列在该表中是唯一的,但不是所有其他的唯一(意味着每个表都可以有一个id为200的请求)。

我意识到我的问题的一个解决方案可能是为每种类型的请求创建一个“Notes”表并相应地创建外键,但这肯定不是解决问题的唯一正确方法。

我真正想知道的是,是否有一种有效的方法可以使用id和请求类型(基本上是表名)来创建外键。这可能吗?

2 个答案:

答案 0 :(得分:3)

作为创可贴,你可以做这样的事情......

enter image description here

... Note上有以下约束:

CHECK (
    (
        “Destination Request Id” IS NOT NULL
        AND “Support Request Id” IS NULL
        AND “Exchange Request Id” IS NULL
        AND “Deposit Request Id” IS NULL
    )
    OR (
        “Destination Request Id” IS NULL
        AND “Support Request Id” IS NOT NULL
        AND “Exchange Request Id” IS NULL
        AND “Deposit Request Id” IS NULL
    )
    OR (
        “Destination Request Id” IS NULL
        AND “Support Request Id” IS NULL
        AND “Exchange Request Id” IS NOT NULL
        AND “Deposit Request Id” IS NULL
    )
    OR (
        “Destination Request Id” IS NULL
        AND “Support Request Id” IS NULL
        AND “Exchange Request Id” IS NULL
        AND “Deposit Request Id” IS NOT NULL
    )
)

这样,您不必更改现有表的PK(可能会对模型的其余部分和客户端应用程序产生级联效应),但您可以拥有适当的参照完整性而无需“重复” Notes表。

答案 1 :(得分:1)

你可以有一个表Note(object_id,note),其中object_id引用任何请求表。您实际上不必在数据库中具有外键约束,或者如果您确实想要维护约束,则可以使用约束子句(可能是特定于供应商的?)。

要确定与注释关联的请求表,您可以在注释中使用枚举类型值。有些数据库供应商有一个Enum类型,有些则可能只使用Int。它只是一些像request_type enum(DESTINATION,SUPPORT等等)的列。

如果您的数据库很小或者可以暂时离线,您可以只重新创建表格,以便它们使用单​​个序列生成所有四个object_id ...这样ID就会在不同的位置上唯一请求表。我喜欢在这种情况下拥有一个通用唯一的object_id序列。

对于某些供应商(postgres),您可以使用表继承。使用表继承,您可以执行类似create table destination_request(....)inherits(note);这将使note表中的任何字段可用于destination_request表上的查询。这在某种意义上起作用,并且在幕后为您工作。从概念上讲,请求不是注释的子类型,因此就OO设计而言,这并不理想,并且表继承可能无法移植到其他数据库供应商。这取决于你对纯度的关注程度。

如上所述,你可以有四个不同的外键指向每个表,但是这会留下一个主要是Null值的表...我可能更喜欢有四个不同的音符表,而不是有一个具有那么多空值的表