将 PK 值设置为数据库中的 API returns 而不是生成 DB 值

Setting PK value to what API returns in database instead of generating DB value

我有一个奇怪的 question/situation 以前从未见过的人...

所以我正在使用一个 API 的小型网站,该网站向我提供他们数据库中的交易信息。

另一方面,我的数据库基本上是这样的:

create table API_Transactions
(
TransactionId int not null -- this is the part on which I have the question
TransactionDate datetime not null,
-- and some other data here...
)

所以你可以看到我的 PK 在我的 API_Transactions table 中,在正常情况下我会定期设置为 DB 自动生成( identity(1,1) 语句)。 ..

但这里棘手的部分是他们的 TransactionID 的这个 API returns 的值总是唯一的,所以我正在考虑执行以下操作(如果它的 possible/smart 或聪明):

使用此 API TransactionID 值作为我自己的 PK 值以确保我的数据库中没有 1 个额外的列)像这样:

create table API_Transactions
    (
    TransactionId int not null identity(1,1) primary key-- this is the part on which I have the question
    API_TranactionID int not null -- id of transaction from the API...
    TransactionDate datetime not null,

    -- and some other data here...
    )

这样我将确保避免在我的数据库中创建 1 个额外的列并节省一些 space(甚至可能在以后使用数据库时提高性能?)..

如果可行,最好的方法是什么?那么我会为我的 PK 使用哪种数据类型以及我将如何设置它?

有人可以帮我解决这个问题吗?

我不会从数据大小的角度来看这个问题。您应该关注存储数据的物理方面。如果您在 table 上实现主键,则意味着它存储为平衡树,并且按主键 column/columns 中的值排序。

现在,使用代理键(表示身份)插入一行意味着您在最后一个数据页的末尾插入一个新行,因此您只需在索引的末尾添加一些数据。因此,如果您生成具有身份的键,则可以轻松地填充索引的数据页,而不会碎片化索引。

另一方面,如果您从另一个系统收到一个整数,您应该假设它或多或少是随机的,因此 SQL 服务器将不得不为新记录找到 space在某些页面中,该页面可能已满并导致页面拆分。它会导致较长的查询执行时间。

综上所述,以身份值为索引性能会更好。至于磁盘 space... 整数并没有那么大,是吗?

所以在互联网上搜索 "premature optimization" 这个词。我不同意@Pawel。 "performance will be better" 的说法是没有根据的。 "performance" 我们在说什么?假设插入性能是最重要的衡量标准(并忽略所有其他衡量标准)还为时过早。我看到一个常见的错误——假设主键也是聚集键。

我同意磁盘 space 在这一点上无关紧要。在您 绝对 知道您不需要提供商提供的键值之前,您应该假设您必须拥有它;那将是我个人的假设。您是否应该使用它作为您的主键取决于您如何处理这些信息。您选择用于集群的列应该与您选择作为主键的列分开讨论。

还有语句 "... 在正常情况下,我会定期将其设置为数据库自动生成 ..." 令人担忧。盲目地遵循某种模式并不是一个好主意。你应该考虑你的自然键是什么并强制执行它们。您应该有意识地选择您的主键。你应该努力确定你的聚集索引应该是什么(特别是因为你只有一个)。当您确定"performance"时,您需要根据table的使用方式对其进行评估-查询类型、DML语句的内容和频率、超过added/modified/deleted的行数时间等。通常,聚类在日期列上是有意义的,因为这往往是一个经常使用的选择标准。

我曾使用从外部提取信息的数据库 "systems"。通常,任何来自外部来源的重要信息都需要您保留来自该来源的键值。为什么?因为您需要外部系统密钥来协调数据。没有它,您会发现很难确定任何差异的来源。您的会计师和审计师可能只是希望您证明您的系统完全匹配。人们往往对交易之类的事情非常挑剔。

所以在这一点上,您没有理由添加自己的合成键并将其用作主键(或聚集索引)。所以 - 不要。你需要一个理由做任何其他事情。