database - 向用户公开代理键

标签 database nhibernate architecture orm primary-key

我正在设计一个新的应用程序,有一个表格包含用户希望用数字唯一标识的项目。该表将有一个代理键,可用于此目的,但我不确定是否应将其公开给用户。他们只会将此 ID 用作只读和查找,应用程序将在幕后处理 key 的创建。

这个想法是为了避免潜在的问题。如果 key 是由 dbms 自动生成的标识字段,则您无法控制该 key 。我在我的应用程序中使用 NHibernate,因此我可以通过使用 HiLo 来控制 key ,如 here 所述,我打算使用。如果重要的话,DBMS 是 Oracle。

暴露 key 后我可能会遇到哪些潜在问题?

  1. 让我们假设用户通过制作一些使用此键的 excel 电子表格来建立对它的依赖。 key 会改变吗?
  2. 如果某些记录在数据库损坏或事故中丢失,并且我想避免与旧 key 发生冲突,我是否可以调整 NHibernate 中的起点以跳过之前生成的数字?
  3. 如果用户想要更改为其他一些识别其记录的方法,该怎么办?假设他们想从一些有意义的字符代码开始。那么我能否向他们显示一个计算的(未存储的)标识符,或者随时根据我的代理主键创建一个新的备用键列?

如果有人可以清楚地展示向用户公开托管代理主键可能会成为 future 问题的示例,我将创建一个备用 key 以呈现给用户,否则我将公开代理主键。

谢谢!

最佳答案

ids 通常并且通常应该是一个实现问题,用户不应该关心它们。我建议您重新考虑是否真的需要向用户显示标识符。不知道您的具体情况,也许是,但我对此表示怀疑。用户不应该关心更新记录 12345 或者他们是客户 54321。用户应该只知道我正在更新我的地址或购买特定商品。

如果向用户公开标识符真的只是让它出现在查询字符串中,那么使用代理主键是完全合适的。

如果确实是用户需要查看id的业务需求:

  1. key 永远不必更改,也不应该更改。 catcall 被获取并将此信息合并到另一个数据库的示例是一种边缘情况,即使在获取中也可能不会发生,除了更改 id 之外还有其他方法,例如使用单独的表或创建复合键。我不会为此担心。

  2. 是的,无论是身份还是 hilo,您都可以更改身份种子或更新 hibernate_unique_key 表以更新新 ID 的范围。我建议在使用 nhibernate 时永远不要使用 identity 并且总是喜欢 hilo(或 guid)。身份生成器需要转到数据库以获取 id,这与 nhibernate 喜欢在 session 中批量操作并在刷新时转到数据库的方式形成对比。有些事情在 nhibernate 中不能很好地工作,如果你使用 identity,你会看到微妙的和意想不到的错误,因为在这种情况下 nhibernate 做的一些事情与你预期的不同(有些事情就是行不通)。

  3. 是的,这些当然是选项。

我不认为暴露 id 是个问题,除了它可能在几乎所有情况下都不是用户真正想要的。不过,没有技术原因不这样做。

关于database - 向用户公开代理键,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8298175/

相关文章:

sql - 使用多个成本表计算用户的余额

mysql - rsync 和 MyISAM 表

c# - IList.Cast<typeof(T)>() 返回错误,语法看起来没问题

linq - NHibernate - 使用 LINQ 选择随机记录数

javascript - 事件的 Backbone Marionette 命名空间约定 - 风格指南

javascript - 无法连接到 mlab 上托管的 MongoDB

nhibernate - HQL:查询动态组件属性

php - 包装 mongoDB 和 mysql

testing - 测试架构的方法有哪些?

sql - 找不到 id=1 的项目 [WHERE "projects"."deleted_at"IS NULL]