English 中文(简体)
数据库设计、 数据库设计、 模拟多个表格的外国密钥的表格
原标题:Database Design, Table emulating foreign keys to multiple tables

我正试图解决问题,并困难地找到最佳解决办法。 我有一个数据库,其中载有(除其他外)下列事项的表格:

  • Destination Request
  • Support Request
  • Exchange Request
  • Deposit Request

每个表格都有一栏供评论(从终端用户到管理员),然而,我被要求增加在所有这些请求中添加注解的能力,我希望每组注解分开,以便我能够追踪注解所添加的日期/时间以及谁编辑的注解,这意味着我需要将注解存储在表格中,并通过外国密钥与请求连接。问题在于,每张请求表有一个自动加注的代号列,该表格是独一无二的,但并非所有其它表格都独一无二(这意味着每张表格可能有200个代号的请求)。

我意识到,解决我问题的办法之一可能是为每一种请求建立一个“注意”表,并据此创建外国钥匙,但这肯定不是解决问题的唯一体面方法。

我真正想知道的是,是否有一种有效的方法来使用id和请求类型(基本上为表格名称)来创建外国密钥。 这是否可行?

最佳回答

做个创可贴 你可以做这样的事...

""https://i.stack.imgur.com/g8f5i.png" alt="在这里输入图像描述"/ >

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 表格的情况下, 拥有适当的优先完整性 。

问题回答

您可以有一个表格备注( 对象_ id, 注意), 其中对象_ id 引用任何请求表格。 您不必在数据库中真的有外国密钥限制, 或者如果您真的想要保持限制, 您可以使用一个限制条款( 可能指定供应商吗? ) 。

为了确定一个备注与哪个请求表相关联, 您可以在备注中有一个 enum 类型值 。 一些数据库销售商有 enum 类型, 还有一些您可能只使用 Int 。 它只是请求_ type enum (DESTINATION, Support, etc.) 之类的一栏而已 。

如果您的数据库小, 或者可以脱机一段时间, 您可以重新创建表格, 这样他们就可以使用一个单一的序列来生成所有四个对象。 这样, 不同的请求表格中, IDs 将会是独一无二的 。 我喜欢对这种情况有一个普遍独特的对象_ id 序列 。

使用一些供应商( posgres), 您可以使用表格遗产。 如果使用表格遗产(...), 您可以做一些事情, 比如创建表格目的地_ resolutions (...) 继承(...) ; 这样可以让备注表格中的任何字段可以查询目的地_ request table 表格。 这在某种意义上可行, 并为您在幕后工作 。 从概念上讲, 请求不是一个子注解类型, 所以从OO 设计的角度来说, 这不理想, 表格遗产可能无法被其他数据库供应商所接受 。 由您决定您如何关注这里的纯洁性 。

你可以有四个不同的外国键 指向每个表格,就像上面建议的那样, 但它留给您一个表格, 大部分是Null值... 我可能更希望有四个不同的注注注表, 而不是一个表格, 上面写了这么多的空值。





相关问题
SQL SubQuery getting particular column

I noticed that there were some threads with similar questions, and I did look through them but did not really get a convincing answer. Here s my question: The subquery below returns a Table with 3 ...

难以执行 REGEXP_SUBSTR

I m 查询Oracle 10g。 我有两张表格(样本数据见下文)。 i m 试图提取一些领域

SQL Query Shortcuts

What are some cool SQL shorthands that you know of? For example, something I learned today is you can specify to group by an index: SELECT col1, col2 FROM table GROUP BY 2 This will group by col2

PHP array callback functions for cleaning output

I have an array of output from a database. I am wondering what the cleanest way to filter the values is example array Array ( [0] => Array ( [title] => title 1 ...

OracleParameter and DBNull.Value

we have a table in an Oracle Database which contains a column with the type Char(3 Byte). Now we use a parameterized sql to select some rows with a DBNull.Value and it doesn t work: OracleCommand ...

Running numbers in SQL

I have a SQL-statement like this: SELECT name FROM users WHERE deleted = 0; How can i create a result set with a running number in the first row? So the result would look like this: 1 Name_1 2 ...

How to get SQL queries for each user where env is production

I’m developing an application dedicated to generate statistical reports, I would like that user after saving their stat report they save sql queries too. To do that I wrote the following module: ...

热门标签