数据库中的外键和创建连接 table

foreign key in databases and creating a join table

我对我们为两个实体之间的关系创建的关联或联接有疑问 table。 我知道如果在银行中有客户(key-id)和loan(key-id) entity.Let borrow 是it.Now之间的关系假设有客户"haven't taken a loan"。 所以我应该把那些客户 ID 放在借用 table 中,而贷款 ID 的相应外键是 NULL.Or 我不应该把那些客户放在借用 table 中。 连接 table.And 的主键是连接 table 所需的主键。

您在客户和贷款之间建立 table 是正确的。

但是在实际借入之前,您不需要在此 table 中执行任何操作。

您借用的主键 table 应该是 复合主键 。由 customer_idload_id

组成

客户

customer_id | name  | ...
1           | Jon   | ...
2           | Harry | ...

贷款

load_id | amount | ...
1       | 1000   | ...
2       | 2000   | ...

customer_id | load_id
1           | 1
1           | 2

在此示例中,您可以看到 Jon 必须贷款,并且分别在借款中有两条记录 table。 Harry 是客户,但他没有贷款,所以在借款中没有记录 table 他。

每个 table(基本或查询结果)都有一个参数化语句(又名谓词):

  • 客户 [customer_id] 已经贷款 [loan_id]
    Borrows(customer_id,loan_id)

当你插入像 VALUES (customer_id,loan_id) (8,3) 这样的行时,你会得到一个陈述(又名命题):

  • 客户 8 已贷款 3

作出正确陈述的行进入 table。做出错误陈述的行不在 table 中。因此,适合 table 的每一行都会声明它是否在其中!

table谓词对应的是参数对应列的应用关系。一行说明了这些值以及通过它们识别的应用程序实体。

选择应用程序关系,即 table 谓词。然后你查看一个应用程序情况并将每个真实的行放入 table 中。或者您查看 table 并查看哪些内容为真(每个存在行)和哪些内容为假(每个不存在的行)。

查询也有根据其条件及其逻辑和关系运算符的谓词。他们的结果保留了使它们为真的行。

所以当某人没有贷款时,他们的 customer_id 不会出现在 Borrows 的任何行中。如果没有任何人借贷,则其 loan_id 不会出现在 Borrows.

的任何行中

如果一列可以为空,那么其 table 的谓词通常如下所示:

  • [name] 为 NULL 且 [customer_id] 标识客户
    或 [名称] 不为空
    AND [customer_id] 确定客户
    AND 客户 [customer_id] 名为 [name]
    Customer(customer_id NOT NULL,name NULL)

(以其他方式使用 NULL 会变得更加复杂。我们会尽可能在查询中删除 NULL 时引入它们。)

我们像往常一样确定候选键并像往常一样选择一个作为主键。例如,Borrows 的键是 (customer_id,name),因为该集合的值是唯一的,并且没有更小的唯一子集。但是确定键涉及 UNIQUE NOT NULL 的列(PRIMARY KEY 只是作为约束的同义词)。但是我们永远 不需要 在列中使用 NULL 因为我们可以有两个

而不是像上面那样的 predicate/table
  • [customer_id] 识别客户
    Customer(customer_id NOT NULL)
  • 客户 [customer_id] 名为 [name]
    Customer(customer_id NOT NULL,name NOT NULL)

就像往常一样,一行在 table 中当且仅当它做出正确的陈述时。

参见 this