依赖于MySQL功能和我的脚本

时间:2012-11-11 11:15:48

标签: mysql

我总是依赖我的PHP编程来完成我需要做的大多数流程,我知道可以通过MySQL查询或功能来完成。例如:

我知道MySQL有一个FOREIGN KEY功能,有助于保持数据完整性,但我不依赖MySQL。我不妨让我的脚本这样做,因为它更灵活;我基本上使用MySQL作为STORAGE而我的SCRIPTS作为处理器。

我想保持这种方式,将大部分负担放在我的编码上。我确保我的脚本在每次进行更改时检查冲突,孤立行等都是健壮的,我甚至还有一个贯穿所有这些数据验证过程的SYSTEM CHECK例程,所以我真的尝试在脚本端执行所有操作因为它不会显着影响整个事物的性能(因为我知道MySQL可以在内部更快地做事我的意思是我当然使用MySQL COUNT()函数。)

当然,对表进行的任何直接更改都不会触发我脚本中的例程。但这是一个不同的故事。我很乐意这样做,我打算继续这样做,直到我不相信。

我现在唯一遇到的问题是,检查重复项。

我目前的例程基本上是插入带有序列号的产品。我需要确保数据库中没有重复的序列号。

我可以简单地依赖MySQL UNIQUE约束来确保这一点,或者我可以在脚本方面这样做,这就是我所做的。

此产品例程是一个BATCH例程,只需一次调用脚本,就可以将1到500个产品的任何内容输入数据库。

显然,我检查提交的数据中的重复条目以及数据库中的数据。这是我常规的一大块

 for ($i = 1; $i <= $qty; $i++) {
    //
    $serial = $serials_array[$i - 1]; // -1 coz arrays start at zero

    //check duplicates in submitted data ++++++++++++++++++++++++++
    if($serial_check[$serial] == 1) { // duplicate found!
            exit("stat=err&statMsg=Duplicate serial found in your entry! ($serial)");
    }else{
        $serial_check[$serial] = 1;
    }


    //check duplicates in database
    if(db_checkRow("inventory_stocks", "WHERE serial='$serial'"))exit("stat=err&statMsg=Serial Number is already used. ($serial)");
    //++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

}

好吧基本上就是这样:

1)通过创建一个我可以根据提交的每个序列号检查的数组来检查重复项的提交数据 - 这对于PHP甚至高达1000条记录都没有问题,而且非常快。

2)但是,为了检查数据库是否有重复项,我必须调用我所做的函数(db_checkRow)w / c基本上在提交的EACH序列上发出一个SELECT语句,看看是否有匹配/重复。

因此,基本上,500个SELECT语句用于检查重复项,而不仅仅是MySQL唯一约束功能。

这真的很重要吗?

我设计这样的软件的另一个原因是,至少如果我需要在不同的数据库上部署我的东西,我不会太依赖数据库功能,因此我可以轻松调整我的应用程序。 / p>

2 个答案:

答案 0 :(得分:3)

几乎可以保证MySQL在检查重复项时会更快。除非您在某些超级计算机上运行PHP并且MySQL在旧手表上运行,否则索引检查将比您通过PHP执行的操作更快,更优化。

更不用说你的进程没问题,直到其他人(或其他应用程序)开始写入数据库。您可以保存自己必须首先编写重复的检查代码 - 并在下一个应用程序中再次编写 - 依此类推。

答案 1 :(得分:1)

你错了。你非常非常危险。

数据库专为特定功能而设计。在强制执行唯一约束时,您永远不会击败MySQL。数据库的设计目的是尽快明确地执行。您可以在PHP中更快或更高效地执行此操作不可能,因为您仍需要访问数据库以确定您插入的数据是否重复。

您可以通过 500 select语句来强制执行单个唯一约束。随着你的桌子的增长,这将变得更加荒谬。当你的桌子遇到2,000行时会发生什么?如果你有一个包含一百万行的新表怎么办?

使用明确设计的数据库功能,让您的生活更轻松。

您还假设访问数据库的唯一方法是通过应用程序。这是一个非常危险的假设,随着时间的推移几乎肯定是不正确的。

请阅读this programmers question,这似乎是专门为您编写的。简单地说,“永远不要在代码中做什么,你可以让SQL服务器为你做好”。我不能强调这一点。