搜索实体 - 属性 - 值数据

时间:2013-12-11 15:45:19

标签: sql tsql entity-attribute-value

对EAV数据进行搜索的最佳方法是什么?鉴于此表中存储了十几个字段,我需要能够搜索它们的任意组合:“琼斯”的姓氏和“斯普林菲尔德”的城市以及“1”的状态。有一个搜索表单可以填写任何字段。

显然最终版本会更有活力,但到目前为止我已经得到了:

SELECT DISTINCT Utility.ClientSearch.ClientId AS ClientId,
    cs1.FieldValue AS FirstName, 
    cs2.FieldValue AS City
FROM Utility.ClientSearch
LEFT OUTER JOIN Utility.ClientSearch AS cs1 
    ON cs1.ClientId = Utility.ClientSearch.ClientId 
    AND cs1.FieldName = 'LastName' 
LEFT OUTER JOIN Utility.ClientSearch AS cs2 
    ON cs2.ClientId = Utility.ClientSearch.ClientId 
    AND cs2.FieldName = 'City'
WHERE (cs1.FieldValue = 'Jones') 
    AND (cs2.FieldValue = 'Springfield')

对近百万条记录似乎很快,但我想知道这是否是最有效的方法,或者是否有更好的方法。

我意识到EAV不是一个好主意,但它不是我的应用程序。我只是围绕别人的应用程序编写一个查询包装器。我无法控制应用程序或它的数据结构。

1 个答案:

答案 0 :(得分:0)

我不确定你为什么要自己加入3次......第一张桌子没有用处。

SELECT DISTINCT cs1.ClientId AS ClientId,
    cs1.FieldValue AS FirstName, 
    cs2.FieldValue AS City
FROM Utility.ClientSearch AS cs1 
INNER JOIN Utility.ClientSearch AS cs2 
    ON cs1.ClientId = cs2.ClientId 
WHERE cs1.FieldName = 'LastName' 
    AND cs1.FieldValue = 'Jones'
    AND cs2.FieldName = 'City'
    AND cs2.FieldValue = 'Springfield'

如果您的表变得如此之大以至于您开始看到性能问题,请查看ClientID上的表分区