2

我有一个表,它只包含有关文件的信息,因此,由于文件路径是唯一的并且可以识别任何条目,我认为我应该将它用作主键。

虽然,我遇到了一些问题,比如需要指定密钥长度(错误 1170)。我该怎么办?使用整数作为主键,每次我需要访问文件“x”的信息时,执行“where FilePath=x”?

感谢您花时间阅读我的问题。

4

4 回答 4

4

在大多数数据库中,为足够长以存储深度文件路径的字符串列创建索引是低效的(甚至是不可能的)。这是使用代理键的好情况。

另一种选择是使用廉价的散列函数从文件路径计算固定长度的散列,例如MD5()(尽管 MD5 的强度不足以用于密码,但在这种情况下,它足以确保输入数据的唯一性)。

于 2009-03-26T21:45:08.327 回答
3

使用 int 作为主键并将 Unique 放在文件路径的字段中。

CREATE TABLE `cms`.`test` (
    `id` INT( 32 ) NOT NULL AUTO_INCREMENT PRIMARY KEY ,
    `filepath` VARCHAR( 255 ) NOT NULL ,
UNIQUE (
    `filepath`
)
) ENGINE = MYISAM 
于 2009-03-26T21:19:12.960 回答
1

您可以为文件路径指定最大长度并将列更改为 varchar 吗?

这篇文章解释了这个错误。基本上,您不能将键放在文本或 blob 列上,因为键需要一个长度来检查唯一性。但是 text 和 blob 列不支持长度。所以你不能在一个键中使用它们。

在更高版本的 MySQL 中,Varchar 列最多可以包含 65K 个字符

VARCHAR 列中的值是可变长度字符串。在 MySQL 5.0.3 之前,长度可以指定为 0 到 255 之间的值,在 5.0.3 和更高版本中可以指定为 0 到 65,535 之间的值。MySQL 5.0.3 及更高版本中 VARCHAR 的有效最大长度取决于最大行大小(65,535 字节,在所有列之间共享)和使用的字符集。

于 2009-03-26T21:24:29.467 回答
1

不要使用自然键(文件路径/名称)使用代理键(int)

我会将主键设为 INT,并将任何路径和文件放入不同的列中。将长字符串作为键和/或作为其他表中的外键会很慢。

您可能希望从路径中拆分文件名,和/或仅存储路径的一部分。路径的主根可以是附加到数据库部分路径+文件名的配置设置。

当我们存储文件信息时,我们只存储名称,路径是基于其他数据构建的:相关项目(订单、事件、工作等),然后是其他数据的 ID,等等......

于 2009-03-26T21:34:53.093 回答