数据库 table 设计 - 使用长列作为主键有什么问题吗?

Database table design - Are there any problems with using a long column as a primary key?

请原谅我可能是一个愚蠢或明显的问题 - 我是数据库新手。

我打算将文件路径链接存储到 java 的 Derby 数据库中的磁盘媒体文件,但我很好奇设置 table 的最佳方法。

澄清一下,我不打算将实际媒体存储在数据库中,只存储文件路径。

table 将包含 10k-100k 行的顺序。

我认为文件路径应该是主键,因为它唯一标识每个媒体文件。

使用文件路径设置 table 并能够高效搜索(主要针对文件名中的子字符串,但也针对媒体属性)的最佳选项是什么?

我打算使用 VARCHAR(4096),因为最大 linux 路径长度为 4096 个字符。

以这种方式创建 table 是否有任何优点或缺点,索引可能是相当长的 VARCHAR 列?你建议我应该如何设计 tables?

谢谢!

免责声明:这是一个非常个人的意见,可能很多人会不同意。

您正在考虑使用 "natural key",我反对使用它们。自然键是一个现有的 属性 对象,它唯一地标识它......直到它没有。

这就像我的全名,是我在我国的身份证号码。那些属性看似独一无二,但问题是它们并不是stable。它们是可见的现有已知属性;这种可见性使他们容易受到变化的影响。这意味着,它们 会及时改变 。如果我改了名字,我还是同一个人吗?

另外,一个键通常用于与其他 table 有点 链接。一个大的PK对此并不好。但这更多是一个实际问题。

我建议您使用简单的 INT 或 BIGINT 作为主键,并向路径添加 UNIQUE 约束 属性。这样你的模型会更灵活。如果媒体移动到另一个路径,您只需要更新 table 中的单个值;如果路径是 PK,那么您将需要更新与其相关的所有外键。

不要使用长字符串作为主键。

使用合成主键。

这里有一些原因:

  • 主键的一个重要用途是支持外键。当您只需要一个 4 字节整数时,您不希望 4k 字符串潜伏在您的数据库中。
  • 主键的另一个重要原因是可以唯一地找到每一行。我认识的大多数人都不想输入 4k 字符来标识一行。我打字很快,这对我来说需要时间。而且我确定我会在某个地方打错字。
  • 两个字符串可能仅在第 2017 个字符不同。我不想弄清楚它们是不同的,特别是如果字符是 1lO0.

定义一个自动 incrementing/identify/serial 主键。您始终可以将 URL 声明为 unique,这样它就不会重复(尽管某些数据库可能不允许在索引中使用如此长的键)。