首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >EAV设计查询

EAV设计查询
EN

Stack Overflow用户
提问于 2016-04-05 17:05:00
回答 1查看 713关注 0票数 0

我有三张这样的桌子。

代码语言:javascript
复制
     Entity_Table
|e_id|e_name|e_type  |e_tenant|
|1   | Bob  |  bird  | owner_1|
|2   | Joe  |  cat   | owner_1|
|3   | Joe  |  cat   | owner_2|
代码语言:javascript
复制
     AttributeValue_Table
|av_id|prop_name |prop_value|
|1    | color    | black    |
|2    | color    | white    |
|3    | wing size|   7"     |
|4    | whiskers | long     |
|5    | whiskers | short    |
|6    | random   | anything |
代码语言:javascript
复制
     Entity_AttrVal
     |e_id|av_id|
     | 1  |  1  |
     | 1  |  3  |
     | 2  |  2  |
     | 2  |  5  |
     | 3  |  1  |
     | 3  |  4  |
     | 3  |  6  |

我想要做的是‘查找实体e_name='Joe’以及color=black和whiskers=short。

我可以获得一个结果集,其中每一行都有一个支柱/值,以及实体信息,因此查询一个属性是可行的。但是我需要能够做任意的N个属性。我该怎么做这样的事?

是否可以将所有属性都作为列或其他内容构建联接表?

edit2:看来我能做这样的事

代码语言:javascript
复制
SELECT et.e_id, et.e_name, et.e_type
FROM Entitiy_table et 
LEFT JOIN Entity_AttrVal j  ON et.e_id = j.e_id 
RIGHT JOIN AttributeValue_Table at ON at.av_id = j.av_id
WHERE (av.prop_name='color' AND av.prop_value='white') OR (av.prop_name='whiskers' AND av.prop_value='long')
GROUP BY et.e_id, et.e_name, et.e_type
HAVING COUNT(*) = 2;
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-04-05 19:54:14

您必须为每个名称/值组合添加一个谓词:

代码语言:javascript
复制
  SELECT <whatever you need>
    FROM Entity_Table et
   WHERE et.e_name = 'Joe'
     AND EXISTS (SELECT 1 
                   FROM AttributeValue_Table avt
                   JOIN Entity_AttrVal ea ON ea.e_id = et.e_id
                  WHERE ea.a_id = avt.av_id
                    AND avt.prop_name = 'color'
                    AND avt.prop_value = 'black')
     AND EXISTS (SELECT 1 
                   FROM AttributeValue_Table avt
                   JOIN Entity_AttrVal ea ON ea.e_id = et.e_id
                  WHERE ea.a_id = avt.av_id
                    AND avt.prop_name = 'whiskers'
                    AND avt.prop_value = 'short')

(如果我的Sql Server方言闪现出来,我很抱歉)

要进行任意数量的比较,必须生成SQL并执行它。

正如在一篇评论中所说的,这表明EAV是一种痛苦(实际上是一种反模式),但我从经验中知道,如果我们绑定到关系数据库,有时就没有其他选择。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/36432744

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档