java - 在数据库中创建空对象或稍后保存

标签 java mysql database spring user-interface

我的数据库中有下表:

CREATE TABLE document (
  id INT PRIMARY KEY AUTOINCREMENT,
  productModelId INT NOT NULL,
  comment VARCHAR(50),
  CONSTRAINT FK_product_model FOREIGN KEY (productModelId) REFERENCES product_model(id),
)

当然,真正的表要复杂得多,但这足以理解问题。

我们的用户希望在单击“新建”按钮时看到文档的编号。因此,为了做到这一点,我们必须在数据库中创建对象并将该对象发送给客户端。但有个问题。在将对象保存到数据库之前,我们需要知道 productModelId。否则我们将有一个 sql 异常。

我看到了两种可能的变体(两者都很丑,真的):

  1. 向用户显示带有产品模型的模态列表,然后在数据库中创建对象,其中包含用户选择的 productModelId。

  2. 创建一个临时编号,然后在用户完成编辑文档并保存 id 时将对象保存在数据库中。我们还需要删除 NOT NULL 大小写并在代码中验证此位置。

第一种方法不好,因为我们的应用程序中有太多模态框。我们的 UI 太多了。

第二个变体很丑陋,因为我们的数据库在没有所有检查的情况下是不一致的。

您能建议我们做什么?有什么新的解决方案吗?你在你的应用程序中做什么?可能是一些 UI 提示。我们目前正在使用第一个变体。

最佳答案

理论上说你在数据库上使用的id不应该是相关信息,所以如果没有很好地隐藏在URL或类似的东西中,用户不应该看到它,所以你不应该向用户显示它,问题你有一个可能的证实这一理论。

现在你的解决方案是部分正确的:它满足技术要求,但仍然很糟糕,因为如果用户没有完成插入,你最终会得到空记录的数据库(意思是,有 ID 和外部key ok,但所有其他字段为空或具有无用的默认值),因此您基本上是在绕过数据库验证。

有两个更好的解决方案,但都需要您检查您的数据库。

首先是不要将 id 用作显示给用户的东西。使用另一个带有另一个“id”的列,声明它在数据库中是唯一的,在应用程序中生成它,将它显示给用户,然后在任何需要的地方使用这个另一个“id”(如果它是唯一的,它实际上是一个 id)。

第二个是经常使用的一个,因为它不需要中央数据库或其他权限来检查 ID 的唯一性,因此在分布式环境中扩展性更好。

放弃使用自动递增或不自动递增的通用“id int”,并使用 UUID。您的 id 将是一个 varchar 或一个二进制文件,一个 UUID 实现(如 java.util.UUID,但您可以在其他语言中找到)将在您需要的任何时候(以及任何地方,甚至在客户端上)自行生成一个唯一的 id它,然后您在保存时提供此 ID。

关于java - 在数据库中创建空对象或稍后保存,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25689162/

相关文章:

java - 使用外部 jar 的打包解析器

php - Codeigniter 模型从 -7 天开始获取行

database - 单元测试依赖于数据库的窗口服务

sql - 使用 COUNT/Group By 时需要选择所有列

java - 约束布局 : Unable to Wrap_Content and Stack RecyclerView Items

java - ServletModule.filter 与 @WebFilter

Java:如何在显示对话框时禁止单击面板?

匈牙利语字符的 MySQL 错误 ORDER BY

php - 如何按非字母顺序显示MySQL记录?

mysql - 在SQL错误1206中插入一个巨大的表