在db中创建空对象或稍后保存它们

时间:2014-09-05 15:22:37

标签: 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),
)

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

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

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

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

  2. 创建临时数字,然后在用户完成编辑文档并保存ID时将对象保存在db中。我们还需要删除NOT NULL情况并在代码中验证这个somwhere。

  3. 第一种方法很糟糕,因为我们的应用程序中有太多的模态。我们的UI太重了。

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

    你能建议我们做什么?任何新解决方案?你在你的应用程序中做了什么?可能是一些UI提示。我们目前正在使用第一个版本。

2 个答案:

答案 0 :(得分:2)

理论上说你在数据库中使用的id不应该是相关信息,因此如果没有很好地隐藏在URL或类似信息中,用户不应该看到它,所以你不应该将它显示给用户,并且问题你有这个理论可能的确认。

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

有两种更好的解决方案,但两者都要求您查看数据库。

首先不要将id用作向用户显示的内容。使用另一列,使用另一列" id",在数据库中声明它是唯一的,在应用程序中生成它,将其显示给用户,然后使用另一个" id" (如果它是唯一的,它实际上是一个id),无论何时需要。

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

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

答案 1 :(得分:0)

我们按照以下方式制作。

使用字段issue_type_id和lastId创建表id_requests。我们需要这样做以避免两个用户按下“新”按钮并获得相同ID的情况。

当然,我们在我们使用此功能的所有表中添加了字段innerNum。

谢谢!