对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不是一个好主意,但它不是我的应用程序。我只是围绕别人的应用程序编写一个查询包装器。我无法控制应用程序或它的数据结构。
答案 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上的表分区