1

我有四个类:用户、属性、属性类别、属性值。

以及数据库中的四个表:tbl_user、tbl_attribute、tbl_attribcategory、tbl_attribval​​ue。

这些是表之间的关系:

tbl_user 1 --- n tbl_attribvalue n --- 1 attribute 

(tbl_attribval​​ue 是属性和用户之间的中间表

tbl_attribcategory 1 ---- n tbl_attribute

这是一个例子:

tbl_user
{id:1, name: Jack}



tbl_category {id:2,label: Career and Education}

tbl_attribute :
{id:1 ,category:2,label:employer , variable: employer}
{id:2 ,category:2,label: High school , variable: high_school}
{id:3 ,category:2,label:college , variable:college}

并且由于 tbl_attribval​​ue 是 tbl_attribute 和 tbl_user 之间的中间表,所以我们应该知道 user id 和 attribute id ...才能知道 user 的属性值。

示例

tbl_attribvalue {id:1,iduser:1,idattrib:3,value: Harvard University}

当我们在应用程序中使用动态属性而不是静态标签时使用此系统。

上课呢?

这四个类:User、Attribute、Attribval​​ue、Attribcategory 分别包含 getter 和 setter 以及属性。

我想返回给定用户的所有这些属性、属性类别和属性值……但我不知道具体使用什么方法,这是一个概念。

我的控制器中已经有这段代码(在 MVC 模型中):

$atcdata=array();
$attribcategory=new Attribcategory($atcdata);
$attribcategories=$manager->viewIt($attribcategory,' defined=0 AND ownertype=1');

$manager 是一个 DBManager,它包含一个函数 viewIt($object,$criteria),然后使用给定的条件返回一个包含给定对象结果的数组。

所以属性类别将包含所有类别。

但是如何使用这些类别信息来返回给定用户的属性和属性值?

换句话说 :

我知道如何返回它们,但就性能而言,我不想使用两个以上的查询来获取所有数据。

对于给定用户,此数据示例将显示如下

[attrcategory]
    [attribute] : [attrvalue]
                  [attrvalue]
                  [attrvalue]

Work & Education 
    Employer : Oracle 
               Microsoft

    College : Harvard
    High school : harvard

之类的。

先感谢您

4

1 回答 1

1

你做错了 MVC .. 但这不是问题。

您在那里拥有的是“条目-属性-值”反模式。它在SQL 反模式中进行了探讨(在同标题的章节中)。这就是导致您的问题的原因。

要在单个查询中获取所有结果,您可以做的最好的事情是针对类似于以下响应结构的内容:

[attrcategory] , [attribute] , [attrvalue]+[attrvalue]+[attrvalue]
[attrcategory] , [attribute] , [attrvalue]
[attrcategory] , [attribute] , [attrvalue]+[attrvalue]+[attrvalue]+[attrvalue]

能够产生这种结果的查询大致如下所示:

SELECT 
    AttributeCategories.title AS attrcategory, 
    Attributes.title AS attribute, 
    GROUP_CONCAT(DISTINCT AttribureValues.value
                 ORDER BY AttribureValues.value DESC SEPARATOR '+')
         AS list
FROM AttribureValues
    LEFT JOIN Attributes USING (attribute_id)
    LEFT JOIN AttributeCategories USING (category_id)
    LEFT JOIN Users USING (user_id)
WHERE 
    Users.name = 'John Smith'
GROUP BY Attributes.attribute_id

然后在 PHP 结束时,您将不得不explode()在分隔符上设置值。

于 2012-06-10T18:45:57.057 回答