我对我们为两个实体之间的关系创建的关联表或联接表有疑问。 我知道外键在连接表中可以为NULL。但是,连接表只应包含关系。如果在银行中有一个客户(key-id)和一个贷款(key-id)实体。让我们借用它之间的关系。现在假设有客户“没有贷款”。 因此,我应该将借用表中的客户ID和loan-id的相应外键取为NULL。或者我不应该将这些客户带入借用表中。 什么可以是连接表的好主键。它是所需连接表的主键。
答案 0 :(得分:1)
您在客户和贷款之间建立联接表是正确的。
但是,在实际借入之前,您不需要在此表中执行任何操作。
借用表的主键应该是复合主键。由customer_id
和load_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)
每个表(基本或查询结果)都有一个参数化语句(也就是谓词):
Borrows(customer_id,loan_id)
当您插入像VALUES (customer_id,loan_id) (8,3)
这样的行时,您会得到一个声明(也就是命题):
生成true语句的行放在表中。制作虚假陈述的行不在表格之内。因此,适合表格的每一行都会声明它是否在其中!
表谓词对应于参数对应于列的应用程序关系。一行说明了这些值以及通过它们确定的应用程序实体。
您选择应用程序关系,即表谓词。然后,您查看应用程序情况并将每个真正的行放入表中。或者你查看表格,看看哪些是真实的(每个当前行)和假(每个缺席的行)。
查询还根据其条件及其逻辑和关系运算符具有谓词。他们的结果保留了使它们成为真实的行。
因此,当某人未获得贷款时,他们customer_id
不会出现在Borrows
的任何一行中。如果任何人都没有获得贷款,那么loan_id
的任何一行都不会显示Borrows
。
如果列可以为null,则其表的谓词通常如下所示:
Customer(customer_id NOT NULL,name NULL)
(在其他方面使用NULL
会变得更加复杂。我们会尝试删除查询中的NULL
,尽可能接近它们。)
我们像往常一样确定候选键,并选择一个作为主键作为ususal。例如,Borrows
的密钥是(customer_id,name)
,因为该集的值是唯一的,并且没有较小的唯一子集。但确定密钥涉及UNIQUE NOT NULL
的列(PRIMARY KEY
只是约束的同义词)。但我们并不总是需要在列中使用NULL
,因为代替上面的谓词/表格,我们可以有两个:
Customer(customer_id NOT NULL)
Customer(customer_id NOT NULL,name NOT NULL)
就像一个行总是在一个表中进行,当且仅当它做出真正的陈述时。
请参阅this。