2012-08-09 54 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