数据库 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 个字符不同。我不想弄清楚它们是不同的,特别是如果字符是
1
与 l
或 O
与 0
.
定义一个自动 incrementing/identify/serial 主键。您始终可以将 URL 声明为 unique
,这样它就不会重复(尽管某些数据库可能不允许在索引中使用如此长的键)。
请原谅我可能是一个愚蠢或明显的问题 - 我是数据库新手。
我打算将文件路径链接存储到 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 个字符不同。我不想弄清楚它们是不同的,特别是如果字符是
1
与l
或O
与0
.
定义一个自动 incrementing/identify/serial 主键。您始终可以将 URL 声明为 unique
,这样它就不会重复(尽管某些数据库可能不允许在索引中使用如此长的键)。