我有一个'贷款明细' SQL Server中的表。
与订单/订单详细信息方案非常相似,详细信息表与父母贷款'表,并且需要它自己唯一的主键,因为它包含每LoanId
个多行。
然而,由于是财务数据,它可以定期更改 - 每季度/每月6次/每年,而不是每天或每小时。
我正在尝试为贷款明细表建立主键。
每笔贷款可能有几种贷款利率,所以我目前有两种选择:
PK1
PK: LoanId smallint
PK: AnnualRate decimal(9,4)
在这种情况下,年利率将用作主键的一部分(因为它对于贷款来说是唯一的。
AnnualRate
列未与任何其他表格相关联,但会不时更改。
PK2
PK: LoanId smallint
PK: RateId tinyint <-- a surrogate column not used anywhere else
其他专栏
AnnualRate decimal(9,4)
... etc.
在这种情况下,如果费率发生变化,主键不会改变,但贷方仍可以添加或删除费率。简而言之,它必须经常改变。
作为一个缺乏经验的SQL人,我正在寻求建议,因为此时的任何错误都可能难以进一步发展。
答案 0 :(得分:1)
您应该有一个唯一的标识列作为主键。我希望这些方面有所作为:
npm install
create table LoanDetail (
LoanDetailId int identity(1, 1) primary key,
LoanId int references Loans(LoanId),
Rate decimal(9, 4),
eff_date date not null,
end_date date
);
和eff_date
代表费率生效的时间段。
答案 1 :(得分:1)
这里真正的问题是主键,自然键和代理键之间的区别。
自然键是数据中存在的一列或一组列,它们使数据行唯一。自然密钥可能存在也可能不存在。
代理键是您添加到数据中的一列或一组列,以使数据行唯一。你找不到代理钥匙;你建造了它。
主键唯一标识一行数据。它可能是一个自然键,也可能是代理键,但在任何一种情况下都是不可变的。否则,你就会失去参照完整性。
根据您的贷款明细表中的事物声音,当前不可变的唯一列是LoanId。这很好,但这意味着如果你要在你的桌子上有一把主键,它必须是代理键,并且Gordon已经在他的答案中设置了DDL来设置它。
答案 2 :(得分:0)
在我看来,主键应该是LoanId
和DateRateSet
,这将是一个时间戳,用于指示LoanId
的费率发生变化的时间。该组合将使AnnualRate
唯一标识。
例如:
LoanId DateRateSet AnnualRate
1 2017-01-01 01:04:20 0.05
1 2017-02-01 01:20:20 0.03
1 2017-08-01 05:04:20 0.05
1 2017-09-01 01:20:24 0.02
它们可以在同一个LoanId
内重复,但是您可以为每个{1>}指定一个时间戳。