照片的唯一命名 - GUID vs 顺序号

3
不久前,我为我所工作的市政会编写了一个计划管理系统,让我们可以通过访问数据库将所有旧计划和新计划以数字格式存储,并与信息相关联(当时我不知道 MS SQL Server)。
每个计划都有一个唯一的计划ID,它只是一个自动递增的整数(主键),一个标题和图片的路径。当时,我只使用GUID作为图片名称来确保唯一性,现在我想知道这是否是一个错误的决定。
所有图片在导入时都被移动到一个中央文件夹中,因此它们的名称必须是唯一的。
我在想,也许我应该只使用自动递增的整数作为文件名,而不是冗长且不太用户/调试友好的GUID。
你会怎么做?
编辑:抱歉,忘记提到文件实际上只有软件知道,导入后程序会在其原始文件夹中创建一个指向该文件的快捷方式,并使用原始文件的名称。我这样做是为了让人们在不必经过程序的情况下仍然可以访问文档,以便旧的超链接等仍然可用。

请注意,在单个文件夹中有数万个文件的服务器检索文件时可能会出现性能问题。 - Tony Toews
8个回答

6

通常情况下,整数键更快,但是如果不小心处理,可能会在归档和复制时遇到问题。如果您没有性能问题或者疑虑,我建议您使用GUID。

无论如何,我建议您允许用户为UI中显示的每个图像分配一个“友好”的名称。


2
据我理解,这些图片仅供软件自身使用,从不直接供人使用。 如果我找不到充分的理由来改变它,我会让它保持原样。

2

如果你有任何复制或"离线工作"的计划,我建议你使用GUID作为文件名和表的主键。


4
如果您考虑使用Jet复制具有GUID主键的数据库,则需要注意,内置冲突解析程序将因此而破坏,因为它期望s_GUID字段存在,但如果您的PK已经是GUID字段,则Jet不会添加s_GUID字段并使用现有的PK。这意味着您必须自己编写冲突解析程序,因此我绝对建议,如果您计划进行复制,请不要使用GUID PK。 - David-W-Fenton

2

Access中的GUID存在几个问题。这里列出了所有问题:

http://trigeminal.com/usenet/usenet011.asp?1033

除非有外部依赖关系需要使用它们,否则我不会在Access应用程序中使用它们。

如果您要存储照片并需要唯一性,则随机自动编号将提供比足够大的数字空间更多的文件存储空间,以存储任何真实世界应用程序将创建的图形文件数量。除非您正在添加独立位置,否则甚至没有任何理由 - 标准递增的自动编号将很好,并且对于多用户环境非常好(对于单用户环境完全平稳)。

因此,NO-GUID不是一个好选择,也不似乎有任何东西可以证明您在原始问题中描述的任何内容。


取决于数据量。最近我在处理数亿条记录时,有些情况下我不能使用64位哈希作为唯一键,因为碰撞的概率(参见生日问题)非常高。 - Eric J.

1

这要看文件名是被用户使用/查看/引用,还是只被软件使用了?用户是否会“知道”计划的ID,然后有机会去查看磁盘上的文件名呢?

如果答案是“不,没有”,我认为我会将计划ID用作文件名,尽管在这种情况下使用GUID也没有什么实际的缺点。


1

这里是否存在任何安全/权限问题?增量数字允许您轻松迭代整数范围以提取所有图像,但采用GUID则不会那么简单。


1

GUID在需要在多个系统上识别图像时非常有用。例如,当您将图像从您的系统复制到另一个系统,然后再次复制回来时。当您将其复制回来时,唯一的GUID将提供可靠的识别方式。

但是,如果只有一个系统将访问它们,自动递增数字会更实用。实际上,如果您只在单个系统上创建GUID,则GUID更容易生成重复的ID,尽管在使用一百万个或更多的GUID之前,重复的机会从统计学上几乎为零变为统计学上非常小。

就我个人而言,我只倾向于在需要在多个系统上创建数据时使用GUID。这将使我能够唯一地识别它们。但是在单个系统上,我只使用递增的数字,并不断增加它,直到......如果可能的话,永远增加。 32位整数仍具有20亿个可能的数字。64位整数甚至可以让您走得更远。

在GUID和整数之间选择以使名称更用户友好?为什么?如果您想要用户友好的名称,请让用户提供它们......


1
如果用户不直接访问中央文件夹中的文件,我会在内部使用GUID并向用户显示友好名称。
如果用户直接与中央文件夹交互,我会在数据库中使用GUID,在文件中使用友好名称,并使用冲突检测算法。
extension = getFileExtension();
filename = getFriendlyName();
int i = 1;
while (File.Exists(filename)) {
    filename = getFriendlyName() + (i++);
}
writeFile(filename+extension);

记得在中心文件夹中按字母(A\、B\等)或字母组合创建子文件夹,这样可以更轻松地检索。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接