数据库中的外键和创建连接 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_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 必须贷款,并且分别在借款中有两条记录 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。
我对我们为两个实体之间的关系创建的关联或联接有疑问 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_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 必须贷款,并且分别在借款中有两条记录 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
因为我们可以有两个
- [customer_id] 识别客户
Customer(customer_id NOT NULL)
- 客户 [customer_id] 名为 [name]
Customer(customer_id NOT NULL,name NOT NULL)
就像往常一样,一行在 table 中当且仅当它做出正确的陈述时。
参见 this。