我的数据库中有以下表格:
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异常。
我看到两种可能的变体(两者都很难看,真的):
向用户显示包含产品型号的模态列表,然后在用户选择的productModelId的数据库中创建对象。
创建临时数字,然后在用户完成编辑文档并保存ID时将对象保存在db中。我们还需要删除NOT NULL情况并在代码中验证这个somwhere。
第一种方法很糟糕,因为我们的应用程序中有太多的模态。我们的UI太重了。
第二个变体是丑陋的,因为没有所有检查,我们的数据库不一致。
你能建议我们做什么?任何新解决方案?你在你的应用程序中做了什么?可能是一些UI提示。我们目前正在使用第一个版本。
答案 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。
谢谢!