需要用户友好的 UniqueId 字符串来存储数据库记录

问题描述 投票:0回答:1

我的应用程序中的每个约会项目都需要一个用户友好的 UniqueId。此 UniqueId 是附加到项目的 BLOB 的“文件夹”名称。所以指南并不好。

我想出的一个解决方案是将项目主题合并在一起,其中保留所有字母数字,附加一个 -,然后插入记录,获取记录 ID,并使用 ID 更新记录。因此,主题为“生日派对”的项目变为“BirthdayParty-23”。但这是对数据库的 2 次写入。

一个半限制是,如果我在数据库中创建记录之前知道 UniqueId 值,那么我的保存代码会更快。 (通过这种方式,我调用异步方法来创建 BLOB,然后调用 SaveChangesAsync(),然后等待所有这些任务完成。)使用 Item.Id PK 意味着写入变为同步。 (仍然是异步调用,但必须先完成第一个 SaveChangesAsync(),然后才能进行 BLOB 异步调用。)

那么...如果我最终得到“BirthdayParty-{num}”,其中 num 是 1 ... 999,999 之间的随机数怎么办?这给了我一个干净的用户友好的 UniqueId。只需向数据库写入 1 次即可。

缺点是名称冲突的可能性不为零。可能性足够小吗?

或者有更好的方法吗?

c# primary-key guid uniqueidentifier
1个回答
0
投票

我知道我已经评论过询问您的要求的“原因”,但如果我处于您的立场,这就是我会做的(并且过去已经做过)。

忘记将用户友好的唯一 ID 的数字部分链接到记录的标识列值。你试图让他们保持一致是没有任何意义的。相反,请使用单独的序列(假设您的数据库供应商有这样的东西),以便您可以在写入数据库之前声明下一个数字。这让您只需向数据库写入一次。

您仍然需要访问数据库才能获取该序列值,但这是一个非常便宜的操作。以下是这种方法的一些优点和缺点......

优点:

  • 只需对数据库进行一次写入。
  • 组合字母数字和该序列的计算值可以保留并显示给用户,而无需在插入后读取 DB。
  • 由于在初始插入后没有立即更新命令,因此您不必担心可能有任何自动审核来跟踪更改。想象一下,如果对于每条记录插入,您都会生成 2 个日志条目,而第二个日志条目始终是“UserFriendlyId 从 'xxxxxx' 更改为 'xxxxxx'”。

缺点:

  • 身份和该值不同步,但如果这是一个要求,我觉得你做错了什么。
  • 如果您请求下一个值并且最终无法写入数据库,则序列最终可能会包含间隙。但身份列中也可能出现间隙。
© www.soinside.com 2019 - 2024. All rights reserved.