我不确定这个主题是否真的有意义,但我不确定如何说出来.这是设置:我有一个Item,有很多ItemLogic,每个都有一个Field.Item例如,每个ItemLogic实体都有25个实体.逻辑确定是否Item匹配表单中的给定输入.例如,Field X has a value greater than A和Field Y has a value equal to B等每个25场.
在当前版本的应用程序中,查询并循环所有相关实体,返回所有ItemLogic所在的第一个匹配项true.它有点贵,但代码简单,而且从来没有那么多项目要看.到现在.
现在,该应用需要过滤3000个项目才能找到匹配项.上一个查询至少有两个连接,在我们的SQL实例上大约需要45秒.这太长了.
存储过程看起来很自然,但这里有一个问题:数据对于每组Items都是动态的,它以字符串值的形式出现,并且通常需要被转换为不同的类型(DateTime或int最常见)来执行实际的比较,一些逻辑被忽略而不是比较.这是存储过程中的大量额外开销,至少它是如何打击我的.
或者,我可以对数据进行分块,但这对于试图匹配集合中最后一个项目的可怜人来说并没有太大的节省.
有什么方法可以加速比赛?
架构和一些示例数据:
CREATE TABLE [dbo].[Items](
[Id] [int] IDENTITY(1,1) NOT NULL,
[Name] [nvarchar](255) NOT NULL
) ON [PRIMARY] TEXTIMAGE_ON [PRIMARY]
CREATE TABLE [dbo].[ItemLogic](
[Id] [int] IDENTITY(1,1) NOT NULL,
[ItemId] [int] NOT NULL,
[FieldId] [int] NOT NULL,
[Value] [nvarchar](max) NULL,
[Comparison] [int] NOT NULL
) …Run Code Online (Sandbox Code Playgroud) 这似乎是一项如此简单的任务,但我很难找到一个我喜欢的解决方案.除了笨重,我找不到任何我会考虑的东西.这是我正在使用的:
有一个搜索表单将变量发布到处理脚本.这些变量是要查询的数据的过滤器.根据用户的权限,可能会有更多或更少的变量进入,具体取决于他们可以访问的过滤器.每个过滤器基本上是指结果来自表格中的字段.每个过滤器的一个选项也是"ANY",因此不需要WHERE子句.
什么是构建查询字符串的好方法.假设有四个变量:$ firstname,$ lastname,$ age,$ dob.但只有部分用户可以通过$ age和$ dob进行过滤.
$query = "SELECT * FROM people";
if(($firstname != 'ANY' && !empty($firstname)) ||
($lastname != 'ANY' && !empty($lastname)) ||
($age != 'ANY' && !empty($age)) ||
($dob != 'ANY' && !empty($dob))) {
$query .= " WHERE";
}
if($firstname != 'ANY' && !empty($firstname)) {
$query .= " firstname='$firstname'";
}
if($lastname != 'ANY' && !empty($lastname)) {
if($firstname != 'ANY' || !empty($firstname)) {
$query .= " AND";
}
$query .= " lastname='$lastname'";
}
...
Run Code Online (Sandbox Code Playgroud)
等等.但这对我来说只是看起来愚蠢,可怕,而且效率低得离谱.我正在使用稍微修改过的MVC模式,那么在搜索模型中为每个可能的过滤器构建方法是否有意义?
我在我正在编写的脚本中碰到的东西让我感到困惑.我有以下内容:
function getPart($part)
{
$array = array('a', 'b', 'c');
if ($part == 'first') $part = 0;
if ($part == 'last') $part = count($array) - 1;
if (isset($array[$part])) return $array[$part];
return false;
}
$position = 0;
echo getPart($position);
Run Code Online (Sandbox Code Playgroud)
所以,如果我要尝试字符串"first",我应该得到"a"作为输出.使用字符串"last",我应该得到"c",依此类推.当我运行上面的脚本时,使用PHP 5.3,我得到"c"...
困惑,我跑了一个快速测试...
var_dump(0 == 'first');
var_dump(0 == 'last');
Run Code Online (Sandbox Code Playgroud)
两者都回归TRUE...... 为什么??? 我对这种行为感到很困惑!
有一个术语,我根本无法想到,我敢肯定,如果我知道这个词,我不会问这个问题,因为我已经在谷歌上找到了答案...但我找不到正确的条款.
我有一个与我合作的标准WinForms应用程序(.NET 4.0).我有一个带有三个按钮的主窗体,每个按钮在后台静默执行一个动作.其中两个按钮需要相当长的时间来处理.在它处理的时候,我想要一个小窗口弹出,我可以给小文本更新("做行动A ......","做行动B ......").
当这个窗口打开并运行时,我不想让用户能够触摸主窗体 - 不使用任务管理器关闭它,不点击其他按钮,不要'.
如何生成主要表单的小"子"形式才能做到这一点?
PS:除了文本更新之外,我还想在它上面放一个小的动画图形,比如ajaxload.info.不确定这是否会影响表单/窗口类型.
我正在开发利用多个框架的PHP应用程序(虽然不是Zend Framework ......)并且我很好地利用了Javascript(主要是jQuery).所有标记都是XHTML,当然还有CSS等.我希望超越Notepad ++的美妙简洁.我正在使用Windows Vista.我正在尝试在Zend Studio 7或Dreamweaver CS4之间做出决定.
它们看起来相当不错,但价格点不同.我已经看过一些关于"关于Dreamweaver的好东西"或"关于Zend Studio的好东西"的清单,但我还没有找到一个直接的比较.
有关下一个IDE的建议吗?除了语言支持和基本错误检查(语法相关,如缺少分号或其他东西),我正在寻找两件绝对必要的东西:
其他细节:
...而且,如果Zend或Dreamweaver不是那个东西 - 任何有关什么的建议?
php ×3
c# ×1
dreamweaver ×1
javascript ×1
mysql ×1
php-5.3 ×1
sql-server ×1
winforms ×1
xhtml ×1
zend-studio ×1