2012-08-09 44 views
2

我目前正在研究一個工作問題,需要根據用戶定義的限制來修剪生成的數據和數據。我嘗試了很多東西,但似乎無法獲得任何有效運行所需的東西。我可能不得不在DB之外運行,這樣我可以擴展運行,但是我認爲如果可能的話,我應該嘗試在DB內部執行。因此,舉例來說,如果我有3個實體:如何高效地修剪數據

Transportation Type: 
Car 
Boat 
Plane 

Color: 
Blue 
Green 
Red 
Purple 
White 

Accessories: 
Trailer 
Wheels 
Propeller 
Parachute 

用戶可以進入限制:

Transportation_Type=Boat, Accessories= Wheels 

那麼,你有一個場景,有船和車輪會受到限制的任意組合。

Example Valid Scenario with restriction: Boat/Red/Trailer 

那麼,這變得複雜的是,你可以想像,如果我建立了3個實體,是不是太糟糕,即便是用戶定義的限制所有可能出現的情況。但是,如果有22個實體(實體基本上是一個具有值的級別)呢?你可以想象這會變得很大,並且很難適用限制。特別是當它是一組限制級別/值(就像船和輪子一樣)。

任何人有任何想法?

通過構建動態類似的語句,我可以通過大約14-16級來獲得它的真正性能,我可以檢查派生場景。但在此之後,處理時間會爆炸(如果關卡中有更多的值,它可以在更低的層次上)。

+0

什麼是數據庫中的表是什麼樣子? – 2012-08-10 00:31:20

+0

嗨戈登。目前這些實體不是分開的。他們存儲在一個相鄰的列表(父子)中,並且限制被定義在集合.... so(組成限制集合的限制的組合) – scarpacci 2012-08-10 03:43:57

回答

1

讀如果我undersand正確的,我們的目標是產生符合特定條件的情況下。場景將從屬性組合中生成。

假設每個實體是在一個單獨的表,你可以做的查詢爲:

select * 
from TransportationType tt cross join 
    Color c cross join 
    Accessories a 
where tt.val in (<accepted transportation types>) and 
     c.val in (<accepted colors>) and 
     a.val in (<accepted accessories>) 

如果我的理解是正確的,這將產生大量的場景作爲實體的數量增加。如果你有一個允許的場景表(實體的組合),那麼這將有助於過濾掉一些事情。

我已經爲每個實體單獨的表所示,但你可以使用子查詢替換它們:

from (select * 
     from table t 
     where t.type = 'TransportationType' 
    ) TransportationType cross join 
    ... 
1

您的問題看起來像是「物料清單」問題(BOM)。 每種可能的有效方案都可以表示爲一個分層系統。

  Transportation 
        | 
        Type 
        | 
       Accessories 
        | 
     Trailer Wheels Propeller Parachute 

讀你的問題,顏色不是約束,所以它不需要被整合到約束樹中。

SQL Server 2008提供了一個非常緊湊和快速的類型來編碼這些類層次結構:HierarchyId類型

對HierarchyId使用查找表,您可以輕鬆定義您的約束,回答場景有效性問題並提取相應的場景結果。

BOM分辨率HierarchyId的的一個很好的例子可以在MSDN Magazine, september 2008

+0

謝謝@PulsarBlow我曾嘗試過層次結構。我會給那一槍 – scarpacci 2012-08-10 03:42:55