1

私たちが抱えているこの仕事の解決を手伝ってくれることを願っています。

元々、次のテーブルがあります。

hwtype
id  name
1   router
2   switch

hwelement
id   idhwtype  name
1    1         RTR1
2    1         RTR2
3    2         SWT1

hwattributes
id  idhwtype name
1   1        speed
2   1        IP
3   2        ports

hwtypeattributes
id  idhwelement    idhwattribute value
1   1              1             100mb
2   1              2             172.16.3.23
3   2              1             10mb
4   2              2             172.16.3.26
5   3              3             8

今必要なのは、この方法でデータを表示する関数です ( hwtype に従って)

hwtype.name =router の場合

element   speed  IP
RTR1      100mb  172.16.3.23
RTR2      10mb   172.16.3.26

テーブルのコーディングを変更せずに、テーブルに新しい要素タイプ、要素、および属性を含めることができるようにするという考え方です。

私は例を探していましたが、残念ながら、私が考慮していなかった値の集計を行う良い例を見つけました.

あなたの助けを前もって感謝します

4

1 に答える 1

0

EAV アンチパターンを使用しています。これは、リレーショナル データベース設計のあらゆる種類のルールを破るものであり、お気づきのように、データを取得するのは非常に厄介です。この設計には他にも多くの弱点があり、他の場所で説明されています。

EAV システムがどのように会社を破壊したかについての素晴らしい記事については、記事「Bad CarMa 」をお読みください。

データベースからルーター属性を取得するには、次のことを行う必要があります。

SELECT e.name AS "element", 
       speedval.value AS "speed", 
       ipval.value AS "IP",
       portsval.value AS "Ports"
FROM hwtype t 
JOIN hwelement e ON (e.idhwtype = t.id)
JOIN hwattributes speed ON (speed.idhwtype = t.id AND speed.name = 'speed')
LEFT OUTER JOIN hwtypeattributes speedval 
  ON (speedval.idhwattribute = speed.id AND speedval.idhwelement = e.id)
JOIN hwattributes ip ON (ip.idhwtype = t.id AND ip.name = 'ip')
LEFT OUTER JOIN hwtypeattributes ipval 
  ON (ipval.idhwattribute = ip.id AND ipval.idhwelement = e.id)
JOIN hwattributes ports ON (ports.idhwtype = t.id AND ports.name = 'ports')
LEFT OUTER JOIN hwtypeattributes portsval 
  ON (portsval.idhwattribute = ports.id AND portsval.idhwelement = e.id)
WHERE t.name = 'router';

単一の行で特定の要素のすべての属性をフェッチすることを主張する場合は、属性ごとに追加の結合のペアが必要であることに注意してください。これは、SQL オプティマイザにとって非常に高価になります。

複数の行の属性をフェッチし、アプリケーション コードで並べ替える方がはるかに簡単です。

SELECT e.name AS "element", a.name, v.value
FROM hwtype t 
JOIN hwelement e ON (e.idhwtype = t.id)
JOIN hwattributes a ON (a.idhwtype = t.id)
JOIN hwtypeattributes v ON (v.idhwattribute = a.id AND v.idhwelement = e.id)
WHERE t.name = 'router';
于 2009-12-18T20:01:54.777 に答える