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

时间:2015-02-04 07:13:47

标签: database relational-database database-schema

我对我们为两个实体之间的关系创建的关联表或联接表有疑问。 我知道外键在连接表中可以为NULL。但是,连接表只应包含关系。如果在银行中有一个客户(key-id)和一个贷款(key-id)实体。让我们借用它之间的关系。现在假设有客户“没有贷款”。 因此,我应该将借用表中的客户ID和loan-id的相应外键取为NULL。或者我不应该将这些客户带入借用表中。 什么可以是连接表的好主键。它是所需连接表的主键。

2 个答案:

答案 0 :(得分:1)

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

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

借用表的主键应该是复合主键。由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必须贷款并且在借阅表中有两个记录。哈利是一名顾客,但他没有贷款,因此借阅表中没有记录给他。

答案 1 :(得分:1)

每个表(基本或查询结果)都有一个参数化语句(也就是谓词):

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

当您插入像VALUES (customer_id,loan_id) (8,3)这样的行时,您会得到一个声明(也就是命题):

  • 客户8已贷款3

生成true语句的行放在表中。制作虚假陈述的行不在表格之内。因此,适合表格的每一行都会声明它是否在其中!

表谓词对应于参数对应于列的应用程序关系。一行说明了这些值以及通过它们确定的应用程序实体。

选择应用程序关系,即表谓词。然后,您查看应用程序情况并将每个真正的行放入表中。或者你查看表格,看看哪些是真实的(每个当前行)和假(每个缺席的行)。

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

因此,当某人未获得贷款时,他们customer_id不会出现在Borrows的任何一行中。如果任何人都没有获得贷款,那么loan_id的任何一行都不会显示Borrows

如果列可以为null,则其表的谓词通常如下所示:

  • [name] IS NULL和[customer_id]标识客户
    或[名称] IS NOT NULL
    AND [customer_id]标识客户
    AND客户[customer_id]被命名为[name]
    Customer(customer_id NOT NULL,name NULL)

(在其他方面使用NULL会变得更加复杂。我们会尝试删除查询中的NULL,尽可能接近它们。)

我们像往常一样确定候选键,并选择一个作为主键作为ususal。例如,Borrows的密钥是(customer_id,name),因为该集的值是唯一的,并且没有较小的唯一子集。但确定密钥涉及UNIQUE NOT NULL的列(PRIMARY KEY只是约束的同义词)。但我们并不总是需要在列中使用NULL,因为代替上面的谓词/表格,我们可以有两个:

  • [customer_id]标识客户
    Customer(customer_id NOT NULL)
  • customer [customer_id]名为[name]
    Customer(customer_id NOT NULL,name NOT NULL)

就像一个行总是在一个表中进行,当且仅当它做出真正的陈述时。

请参阅this