1

User、Attribute、Attribcategory、Attribval​​ue の 4 つのクラスがあります。

および 4 つのテーブル : データベース内の 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 と属性 id を知る必要があります... user の属性の値を知るためです。

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

このシステムは、アプリケーションに静的ラベルの代わりに動的属性がある場合に使用されます。

クラスはどうですか?

User、Attribute、Attribval​​ue、Attribcategory の 4 つのクラスには、それぞれ getter と setter およびプロパティが含まれます。

特定のユーザーのこれらすべての属性、attribcategories、および attribval​​ues を返したい...しかし、どのメソッドを正確に使用すればよいかわかりません。それは問題の概念です。

私はすでにコントローラーにこのコードを持っています(MVCモデル内):

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

$manager は DBManager であり、関数 viewIt($object,$criteria) を含み、指定された基準を使用して、指定されたオブジェクトの結果を含む配列を返します。

属性カテゴリにはすべてのカテゴリが含まれます。

しかし、これらのカテゴリ情報を使用して、特定のユーザーの属性と属性値を返すにはどうすればよいでしょうか?

言い換えると :

それらを返す方法は知っていますが、パフォーマンスの観点から、すべてのデータを取得するために2つ以上のクエリを使用したくありません。

このデータ例は、特定のユーザーに対して次のように表示されます

[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 に答える