【问题标题】:Unique Key Constraint唯一键约束
【发布时间】:2011-05-28 10:47:31
【问题描述】:

在应用程序级别具有唯一键约束的表上处理数据插入/更新的最佳做法是什么?这些是我想出的:

1。在插入数据之前对表运行一个查询,看看它是否会违反约束。

优点

  • 您拥有完全控制权,因此您不必处理任何特定于 DBMS 的错误消息。
  • 额外的数据完整性检查层

缺点

  • 可能会影响性能,因为大多数情况下不会违反约束。
  • 您需要在运行重复数据查询时锁定表。

2。没做什么。更新表格,看看有什么问题。

优点

  • 简单!
  • 总体速度更快,因为您不必在每次更新表时都运行额外的查询。

缺点

  • 您的验证例程取决于数据库层。
  • 如果数据不粘,则必须通过堆栈跟踪查找原因。

哪一个是更广泛接受的解决方案?这些有替代品吗?

我正在使用 Java、JPA、Hibernate 和 Spring BTW。欢迎任何建议,甚至是针对特定框架的建议!

谢谢!

【问题讨论】:

  • 我很可能错了,但我认为 hibernate 的实体管理器会为你解决这个问题?
  • Hibernate 会将来自 DBMS 的任何错误都包含在异常中。我认为 Hibernate 属于数据库/持久层而不是应用层。
  • 第二个优于第一个的另一个优点是第一个解决方案必须以原子方式执行检查和插入以保持正确,而第二个则不然。

标签: java design-patterns database-design application-design


【解决方案1】:

你已经总结得差不多了。如果性能是一个问题,请选择第二种方式。如果诚信是一个问题,请选择第一种方式。

我个人更喜欢诚信而不是表现。硬件很便宜,完整性不行。

相关问题:

【讨论】:

    【解决方案2】:

    我喜欢“乐观”的方法(“什么都不做”)。你已经列举了优点。 您是对的,在这种情况下,您将验证委托给 DB 层。但是如果您使用的是 JPA,则 DB 层也是由 java 层生成的,因此实际上您的验证取决于您在 java 代码中的注释。因此,这不是什么大罪。

    【讨论】:

      【解决方案3】:

      唯一键通常是业务需求,因此您应该使用业务层来检查您打算使用的那个是否可用。将检查委托给数据库是一种优化,只应在需要时进行。

      【讨论】:

      • 数据库会自动为您进行检查。那么问题是在业务层中复制该检查真的有意义吗?
      【解决方案4】:

      如果您的 DBMS 支持,第三种选择是使用 MERGE 操作(有时称为 UPSERT)。通常有一种特定于 DBMS 的方法来检查行是否被插入。

      避免重言式“唯一”键。钥匙是独一无二的,所以“钥匙”这个词足以说明您的意思。

      【讨论】:

      • 有主键约束和唯一键约束。我认为将它们称为主键和唯一键而不是多余的很好。
      • 主键与非“主”键没有什么不同。由于主键也是唯一的,因此将其他键称为“唯一”但如果它们也是“主”键则停止称它们为“唯一”会很混乱(也是多余的)。不要将键与 SQL 关键字混淆——它们不是一回事。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多