数据库表设计-使用长列作为主键是否有任何问题?

问题描述 投票:0回答:2

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

我正计划从Java将文件路径链接存储到磁盘上的Derby数据库中,但我对设置表的最佳方法感到好奇。

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

该表将包含约1万至10万行。

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

设置带有文件路径的表并能够有效搜索(最主要的是查找文件名中的子串,还可以查找媒体属性)的最佳选择是什么?

我计划使用VARCHAR(4096),因为最大Linux路径长度为4096个字符。

以这种方式创建表是否有优点或缺点,并且在很长的VARCHAR列上有索引?您如何建议我设计桌子?

谢谢!

java sql database database-design derby
2个回答
1
投票

请勿将长字符串用作主键。

使用合成主键。

这里是一些原因:

  • 主键的一个重要目的是支持外键。当您可能只有4个字节的整数时,您不想在整个数据库中潜入4k个字符串。
  • 主键的另一个重要原因是唯一地找到每一行。我认识的大多数人都不需要键入4k字符来标识一行。我打得很快,这对我来说需要时间。而且我确信我会在此过程中的某个地方打错字。
  • 两个字符串的区别仅在于,例如,第2017个字符。我不想弄清楚它们的不同之处,特别是如果字符是1lO0的情况。

定义自动递增/识别/串行主键。您始终可以将URL声明为unique,因此它不会重复(尽管某些数据库可能不允许索引中使用如此长的键)。


1
投票

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

您正在考虑使用“自然键”,我反对使用它们。自然键是对象的现有属性,可以唯一地标识它,直到不能识别为止。

就像我的全名,我在我的国家的身份证号码。这些属性似乎是唯一的,但是问题在于它们不是stable。它们是可见的现有已知属性;这种可见性使他们容易改变。这意味着它们会及时[[将改变。如果我改名字,我会是同一个人吗?

也通常将键与其他表进行

链接。大PK并不适合这样做。但这更多是一个实际问题。

我建议您使用简单的INT或BIGINT作为主键,并向path属性添加UNIQUE约束。这样,您的模型将更加灵活。如果将介质移动到另一个路径,则只需要更新表中的单个值即可。如果路径是PK,则您需要更新与其相关的所有外键。
© www.soinside.com 2019 - 2024. All rights reserved.