2012-01-10 15 views
0

[編集]を選択:混乱のために申し訳ありません。私の上司からOKを得て、スキーマのこの部分を投稿してください。私が画像を投稿することができれば、私は元の投稿の詳細を持っていたでしょう。階層構成

私はこのようになります構成スキーマがあります。http://img717.imageshack.us/img717/7297/heirarchy.png

レベルの各

は、それより下のレベルの中に含まれている(すなわち - パートナーが複数のプログラムを持っている)、および各設定レベルの共有の設定設定レベルの他のタイプのキーは(すなわち - デフォルトのタイムゾーンは、パートナーレベルで設定することができ、その後、プログラム、ポートフォリオまたはデバイスレベルから上書きされます)。

私たちができることは、オブジェクトの種類のデフォルトを持ち、より具体的な分類法でそれを上書きすることです。例えば:

は、私が会社であるパー​​トナーのオブジェクトを持っていると言います。階層_構成_キー1がデフォルトのタイムゾーンであるとします。私は、ほとんどの場合、そのパートナーは東海岸(ニューヨーク時間)に設置されることを述べているpartner_configurationを置きます。

は今、私はそのパートナーがサポートしている複数のプログラムを持っています。その特定のプログラムはカリフォルニアに基づいているとします。私はそのプログラムのデバイスがサクラメントの時間であると言うprogram_configurationを置いています。

今のポートフォリオをスキップしてみましょう、と誰かがデンバーへ移動するが、それでも顧客であるカリフォルニア州の外に基づいて、このプログラムに申し込んと言います。私たちは彼らが山岳時代であると言うデバイス設定を設定しました。

階層は次のようになります。

Level  |Timezone (hierarchy_configuration_key 1) 
--------------------------------------------------- 
Partner |NYC 
Program |Sacramento 
Portfolio |null (defaults to most granular above it, so Sacramento) 
Device |Denver 

今、私はhierarchy_configuration_key_idによってグループ化された私の設定を選択します:

私は、内側のレベルを横断する参加するが、私は選択が私を与えたいと思う使用することができます

device_id |portfolio_id |program_id |partner_id |device_config |portfolio_config |program_config| partner_config 
--------------------------------------------------------------------------------------------------------------------- 
1   |2   |1   |35   |Denver  |null    |Sacramento | NYC 

もよいであろう:デバイスの主キー(DEVICE_ID)のために(hierarchy_configuration_key_idによってグループ化された)このような結果最も関連性の高い設定値を与えたSelect、つまり:

device_id |portfolio_id |program_id |partner_id |config_value 
------------------------------------------------------------- 
1   |2   |1   |35   |Denver  

ありがとうございます。それ以上の説明が必要な場合はお知らせください。

+1

レベル数は定数4ですか?どのフィールドがMiataにマツダの子供だと伝えていますか? –

+0

プライマリキーとは何ですか?レベル4?また、データベース構造が不明です。スキーマを表示する。 –

+0

私は説明を追加しました。混乱させて申し訳ありません。 –

答えて

0

私は
...ここで働いていない部分のみが@ EugenRieckさんのコメントで指摘されていると思います - そして、

ENTITY_TABLE 

entity_id | parent_entity_id | entity_name 
    1   NULL   Vehicle 
    2    1   Car 
    3    2   Mazda 
    4    3   Miata 
    5    1   Cycle 
    6    5   Unicycle 
    7    6   Broken Unicycle 


PROPERTY_TABLE 

entity_id | property_type | value 
    1   Wheels  4 
    2   Wheels  NULL 
    3   Wheels  NULL 
    4   Wheels  NULL 
    5   Wheels  2 
    6   Wheels  1 
    7   Wheels  0 

    (And repeated for other property types as appropriate) 


-- Every entity must have the same properties as the parents 
-- (otherwise you have to find the topmost parent first to know what properties exist) 

-- An entity may only have 1 parent 

-- The topmost parent must have a NULL parent_id 

-- The bottommost parent must be no more than 3 joins away from the topmost parent 

...私は少し構造を変えますWhich field tells the Miata it is a Child of Mazda?

このようなことができます...

SELECT 
    entity1.id, 
    property1.property_type, 
    entity1.name, 
    entity2.name, 
    entity3.name, 
    entity4.name, 
    property1.value, 
    property2.value, 
    property3.value, 
    property4.value, 
    COALESCE(property1.value, property2.value, property3.value, property4.value) AS inherited_value 
FROM 
    entity    AS entity1 
LEFT JOIN 
    entity    AS entity2 
    ON entity2.id = entity1.parent_id 
LEFT JOIN 
    entity    AS entity3 
    ON entity3.id = entity2.parent_id 
LEFT JOIN 
    entity    AS entity4 
    ON entity4.id = entity3.parent_id 
INNER JOIN 
    property    AS property1 
    ON property1.entity_id = entity1.id 
LEFT JOIN 
    property    AS property2 
    ON property2.entity_id  = entity2.id 
    AND property2.property_type = property1.property_type 
LEFT JOIN 
    property    AS property3 
    ON property3.entity_id  = entity3.id 
    AND property3.property_type = property1.property_type 
LEFT JOIN 
    property    AS property4 
    ON property4.entity_id  = entity4.id 
    AND property4.property_type = property1.property_type 
WHERE 
    entity1.id    = @entity_id 
AND property1.property_type = @property_type 
0

このソリューションは、@ param1がhierarchy_conであるスキーマに基づいていますfiguration_key_idと@ param2が目的のdevice_idです。それは、デレースと同様の方法を使用していますが、それは、私がCOALESCEを借りていることを除いて、独立して到着しました。

SELECT *, 
IF(dv_key IS NOT NULL,'device',IF(pf_key IS NOT NULL,'portfolio',IF(pg_key IS NOT NULL,'program',IF(pt_key IS NOT NULL,'partner',NULL)))) AS hierarchy_level, 
COALESCE(dv_key,pf_key,pg_key,pt_key) AS key_id, 
COALESCE(dv_value,pf_value,pg_value,pt_value) AS value 
FROM 
(SELECT sim_id, 
dv.device_id, pt.partner_id, pg.program_id, pf.portfolio_id, 
dvc.hierarchy_configuration_key_id AS dv_key, dvc.configuration_value AS dv_value, 
pfc.hierarchy_configuration_key_id AS pf_key, pfc.configuration_value AS pf_value, 
pgc.hierarchy_configuration_key_id AS pg_key, pgc.configuration_value AS pg_value, 
ptc.hierarchy_configuration_key_id AS pt_key, ptc.configuration_value AS pt_value 
FROM device dv 
LEFT JOIN portfolio pf USING(portfolio_id) 
LEFT JOIN program pg USING(program_id) 
LEFT JOIN partner pt USING(partner_id) 
LEFT JOIN device_configuration dvc ON dv.device_id=dvc.device_id AND [email protected] AND dvc.active='true' 
LEFT JOIN portfolio_configuration pfc ON pf.portfolio_id=pfc.portfolio_id AND [email protected] AND pfc.active='true' 
LEFT JOIN program_configuration pgc ON pg.program_id=pgc.program_id AND [email protected] AND pgc.active='true' 
LEFT JOIN partner_configuration ptc ON pt.partner_id=ptc.partner_id AND [email protected] AND ptc.active='true' 
WHERE dv.device_id = @param1) hierchy;