0

我正在尝试找到最有效的代码来捕获父文件夹中的重复文件名。我正在使用具有血统的父子模型将文件树存储在 MySQL 数据库中:

CREATE TABLE `filetable` (
    `id` int(11) NOT NULL auto_increment,
    `name` varchar(50) NOT NULL,
    `parent_id` int(11) NOT NULL,
    `path_num` varchar(255) NOT NULL,
    `path_string` text() NOT NULL,  
    PRIMARY KEY  (`id`)
) ENGINE=InnoDB;

我正在考虑两种方法:
1. 运行查询:

INSERT INTO filetable (name, parent_id, path_num, path_string) 
    SELECT '$name','$pid','$path_num','$path_string' FROM DUAL
        WHERE NOT EXISTS
            (SELECT name FROM filetable WHERE name='$name');

在 PHP 中:

if (mysql_affected_rows() === 0) takeAction($name);

优点:简单的 sql,不需要向表中添加行
缺点:可以在大表上下雪的双重查询

2.在字段上创建唯一索引并使用:

INSERT INTO filetable (name, parent_id, path_num, path_string) 
    VALUES ('$name','$pid','$path_num','$path_string')
    ON DUPLICATE KEY UPDATE 0=0;

在 PHP 中:

if (mysql_affected_rows() === 2) takeAction($name); // Yes 2 for updates

name优点:重复时在一小部分查询上触发更新
缺点:表中的额外行

唯一的字段是 path_string,即文件的完整路径。在我的文件系统中,它可能会变得很长,因此是 TEXT 类型的字段。在 MySQL 中,无法在 TEXT 字段上创建唯一索引。所以我想做的是创建列

`problemsolver` varchar(62) = $parent_id . '_'.$name 

并在其上创建唯一索引。

我希望这些查询构成对数据库的所有查询的 10%。

我的问题是你会使用这两种方法中的哪一种,为什么?还是有更好的选择?

4

1 回答 1

1

两种方法都行。方法 1 并不理想,因为您的查询更加密集,并且每次都执行,正如您所说,并非每次都需要。

方法二更可取,因为您只在需要时才做额外的工作,而且效率更高。

此外,为了减少冲突值的可能性,您可以在存储的值中集成时间戳或一些随机数据。

于 2013-09-06T04:25:17.567 回答