【发布时间】:2015-02-24 08:25:24
【问题描述】:
我正在创建存储在 SQL 数据库中的用户配置文件(javascript 网页)
这些配置文件有一个主键 ID,它具有自动递增功能。
当用户创建其个人资料时,他必须上传一个文件。
我希望将此文件命名为 id.ext,问题是我在创建配置文件期间通过 ajax 上传文件,在配置文件保存到数据库之前,因为用户需要提供有关此文件的信息为了使配置文件被接受。
我可以重试数据库中的 max(id) 并在我的 ajax 上传期间使用它,但如果 2 个人同时创建配置文件:问题。
我想出了其他解决方案:
- 将文件命名为
bigrandom.ext并将此名称存储在数据库中,但我的老板绝对想要id.ext - 在上传时创建带有“未完成”标志 + 日期的空白配置文件,并每月运行一批以删除数据库中未完成的条目
- 使用id.ext上传,如果文件已经存在,则命名为id+1.ext,并通过json消息通知网页,返回POST查询
我认为这是一个常见问题,我想有一些关于此的最佳实践,甚至可能是我不知道的 SQL 的一个特性。
【问题讨论】:
-
您使用的是什么 DBMS(品牌和版本)?文件是作为 LOB 存储在数据库中,还是作为 Web 服务器某处的物理文件存储?您的服务器端代码是否能够在文件上传后立即重命名文件?
-
现在文件是物理存储的,DBMS 是 Microsoft SQL Server 2012,但是为了能够切换物理blob 和更改 DBMS,一切都已创建,所以我会感到内疚使用专有技巧
-
@IggY 你可以说是在完全错误的水平上处理这个问题。您不应该关心 your 代码中的 DB ID。如果您想将该 ID 用于其他事情(例如文件名),那么您最好的选择是创建一个虚拟行(如果您知道如何安全地执行此操作,则在事务中)并使用该 ID。最好将 DB ID 与文件系统名称分开(尽管有一些可维护性参数支持使用 DB ID)。 GUID 可以作为随机文件名正常工作,即使它们有点长。不要猜测 ID -
max(Id) + 1不安全。
标签: javascript sql asp.net