1

私が扱っている複雑なデータ構造があり、単一の SQL クエリでそれに取り組む方法がよくわかりませんが、私の直感ではこれが可能であるべきだと言っています。

私がやっていることの本質は、選択したハードウェア モデルに基づいて、特定のベンダーの利用可能なプランの結果を表示しようとすることです。結果は可能な組み合わせのみに準拠する必要があり、計画には現在、制限テーブルにキーと値のペアとして格納されている制限が含まれています。以下は、私が取り組んでいるものを簡略化したものです。

(ほとんどの人が携帯電話に精通しているので、ワイヤレス デバイスのアナロジーを使用します)

モデル テーブル


model_id
vendor_id
is_data
is_voice
is_4g
is_3g

サンプルデータ:

model_id,vendor_id,is_data,is_voice,is_4g,is_3g
DeviceA,Sprint,1,1,0,1
DeviceB,Sprint,1,0,1,0
DeviceC,Sprint,0,1,0,0
DeviceD,Sprint,0,1,0,0
DeviceE,Sprint,0,1,0,0
DeviceF,Verizon,1,1,0,1
DeviceG,Verizon,1,0,1,0
DeviceH,Verizon,0,1,0,0
DeviceI,Verizon,0,1,0,0
DeviceJ,Verizon,0,1,0,0
DeviceK,Tmobile,1,1,0,1
DeviceL,Tmobile,1,0,1,0
DeviceM,Tmobile,0,1,0,0
DeviceN,Tmobile,0,1,0,0
DeviceO,Tmobile,0,1,0,0

計画表


plan_id
vendor_id
name

サンプルデータ:

plan_id,vendor_id,name
PlanA,Sprint,Big Data Only Plan
PlanB,Verizon,Small Data Only Plan
PlanC,Sprint,300 Min Plan
PlanD,Verizon,900 Min Plan
PlanE,Verizon,Big Data Only Plan
PlanF,Tmobile,Small Data Only Plan
PlanG,Tmobile,300 Min Plan
PlanH,Tmobile,1000 Min Plan

plan_restrictions テーブル


restriction_id
vendor_id
plan_id
type
value

サンプルデータ:

restriction_id,vendor_id,plan_id,type,value
1,Sprint,PlanA,radio,3G
2,Sprint,PlanA,device_type,data
3,Verizon,PlanB,radio,4G
4,Sprint,PlanC,radio,3G
5,Sprint,PlanC,device_type,voice
6,Verizon,PlanD,radio,3G
7,Verizon,PlanD,device_type,voice
8,Verizon,PlanE,radio,3G
9,Verizon,PlanE,device_type,voice
10,Tmobile,PlanF,device_type,data
11,Tmobile,PlanG,device_type,voice
12,Tmobile,PlanH,device_type,voice

キー付きの制限 (実際には 50 近くありますが、これは同じタイプの表現です):


type / value possibilities
radio / 3g, 4g
device_type / data, voice

再クエリを容易にするためにテーブルを再構築する可能性はありますが、約 1000 のモデル、1000 のプラン、および約 2000 の制限があるため、ある程度の柔軟性を維持する必要があります。

個人的には、ここにはある種の構造上の問題があると思います。モデルはおそらく、要素をキーと値のペアとして別のテーブルに持つ必要がありますが、それはさらに複雑であり、そもそもデータ駆動型の制限を適切に適用する方法をまだ決定していません.

4

2 に答える 2

2

このようなものから始める必要があります:

SELECT p.name
FROM Plans as p
INNER JOIN plan_restriction as pr
ON p.plan_id = pr.plan_id
INNER JOIN models as m
ON pr.model_id = pr.model_id
WHERE p.vendor_id = 1 AND m.is_data = 1 AND is_4g = 1 AND ...
于 2013-01-11T23:14:30.010 に答える
0

私はここで他のデータベース管理者と一緒に約 1 時間これを蹴り飛ばしましたが、解決したと思います。同じような状況に陥った方のために投稿します。最大の問題は、私がデータに近すぎて、計画のニーズとモデルのプロパティの間に「意味のある」プロパティと制限を適用しようとしていたことでした..これは実際には必要ありません.

次の表にデータを再構築できます。

  • 予定
  • 制限
  • モデル

  • 計画は制限と多対多の関係を持つ
  • モデルは制限に対して多対多の関係を持つ

intirum テーブルを使用して多対多の関係を解決します

  • Plans_Restrictions
  • モデル_制限事項

これにより、「赤いもの」などの愚かな「制限」を持つことができます

私はチェーンとしてクエリします:

  • 予定
  • Plans_Restrictions
  • 制限
  • モデル_制限事項
  • モデル

すなわち。私が使用できるプランの対象となるプロパティ情報 (制限情報) を持つすべてのモデルを取得するには、次のようにします。

SELECT 
    M.* 
    ,R.*
FROM (
    SELECT P1.*
    FROM Plans P1
    WHERE id_vendor = @id_vendor
) P

INNER JOIN Plans_Restrictions PR
ON P.plan_id = PR.plan_id

INNER JOIN Restrictions R
ON PR.property = R.property

INNER JOIN Model_Restrictions MR
ON R.property = MR.property

INNER JOIN Model M
ON MR.model_id = M.model_id

モデルに適したすべての計画を取得するには、5 つのテーブルの連鎖結合を逆にします。

阿部さんに感謝します。これをすべて詳細に書き留めて説明し、あなたの提案が私の問題を解決しなかった理由を理解することで、私の問題が何であり、私が本当に何をする必要があるかを理解するのに本当に役立ちました. あなたがいなければ、こんなに早く解決できなかったと思います。

于 2013-01-12T00:12:35.547 に答える