2013-01-11 49 views
1

我有一個複雜的數據結構,我正在使用,我不太清楚如何在單個SQL查詢中解決它,但我的直覺告訴我應該可以這樣做。計劃選擇的數據驅動限制

我正在做的事情的本質是試圖根據選定的硬件模型顯示給定供應商的可用計劃的結果。結果應該僅遵循可能的組合,並且計劃包含當前作爲鍵/值對存儲在限制表中的限制。下面就是我一起工作的簡化:

(我將使用無線設備的比喻,因爲幾乎每個人都在用手機familair)

車型表


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個限制。

我個人認爲這裏有一些結構問題,即。模型可能應該將其元素作爲鍵/值對在單獨的表中,但這更加複雜,並且我還沒有確定如何正確應用數據驅動的限制。

+0

我很難想象你在說什麼。是否有可能獲得一些樣本數據和期望的輸出? –

+0

只是一個簡單的說明,我曾想過在計劃和模型之間放置多對多的表格,並以這種方式處理它,我嘗試這種方式的唯一原因是因爲大多數情況下,公平地說:幾乎所有的設備每個供應商的支持幾乎可以擁有供應商提供的幾乎所有計劃,並且具有最小限制。我會爲你上傳一些模擬數據。 – Dave

+0

Dave,閱讀你關於限制的硬編碼的評論,我想更好地理解這個問題。一旦選擇了供應商,我們就剩下一些我們需要通過限制進行過濾的計劃和模型。您的模型的主要問題在於,您在模型表格上存儲Data/Voice/Raido類型的方式與限制中的存儲方式不同。這意味着在你做簡單的INNER JOIN之前,你需要做一個Restrictions表的簡單轉換。無論如何,這將需要一些硬編碼。 – Bulat

回答

0

我踢這個局面,以獲取有關其他DBA是這裏的最後一小時,並認爲我解決它。我將這張貼發佈給任何發現自己處於類似情況的人。最大的問題是我太接近數據,並且試圖在計劃需求和模型屬性之間執行「有意義」的屬性和限制,這並不是真正必要的。

我可以調整自己的數據是下表:

  • 計劃
  • 限制
  • 模型

  • 計劃將有一個多對多的關係限制
  • 模型將會有一個多對多的關係,以限制

我就解決了多對多的關係與intirum表

  • Plans_Restrictions
  • Models_Restrictions

這將讓我有愚蠢的 「限制」,如 「紅事」

我將查詢作爲鏈:

  • 計劃
  • Plans_Restrictions
  • 限制
  • Models_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臺鏈式連接。

謝謝安倍寫下這一切詳細解釋它,並理解爲什麼你的建議沒有解決我的問題真的幫助我瞭解我的問題是什麼以及我真的需要做什麼。沒有你,我不認爲我會如此快速地解決它。

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 ... 
+0

我的困境的關鍵是我不想將限制硬編碼到我的SQL查詢中。 – Dave