如何有效地修剪数据(How to efficiently prune data)

2019-09-21 02:34发布

我目前正在为工作,我需要把数据和修剪根据用户定义的限制的情况下产生的一个问题。 我曾尝试千头万绪,但似乎无法得到任何东西尽可能有效,因为我想运行。 我可能会到数据库外运行,所以我可以缩放运行,但认为我应该尝试,如果能够将数据库内执行。 因此,举例来说,如果我有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的水平。 但在那之后的处理时间爆炸(它可以在较低的水平,如果有在水平更大量的值)。

Answer 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
     ...


Answer 2:

您的问题,看起来像一个“ 物料清单 ”的问题(BOM)。 每个候选条件合理的情况可以表示为一个层级化体系。

            Transportation
                   |
                  Type
                   |
               Accessories
                   |
      Trailer Wheels Propeller Parachute

读你的问题,色彩是不是约束,因此不需要进行intregrated来约束树。

SQL Server 2008提供了一个非常紧凑和快速的类型编码这些类型的层次结构:HierarchyId的类型

使用查找表HierarchyId的,你可以很容易地定义你的约束,回答该方案的有效性问题,并提取相应的方案结果。

BOM分辨率HierarchyId的一个很好的例子可以在阅读MSDN杂志,2008年9月



文章来源: How to efficiently prune data