包含更改内容的表的最佳主键

时间:2018-04-13 09:46:30

标签: sql sql-server database database-design

我有一个'贷款明细' 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人,我正在寻求建议,因为此时的任何错误都可能难以进一步发展。

3 个答案:

答案 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)

在我看来,主键应该是LoanIdDateRateSet,这将是一个时间戳,用于指示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>}指定一个时间戳。