我目前正在为工作,我需要把数据和修剪根据用户定义的限制的情况下产生的一个问题。 我曾尝试千头万绪,但似乎无法得到任何东西尽可能有效,因为我想运行。 我可能会到数据库外运行,所以我可以缩放运行,但认为我应该尝试,如果能够将数据库内执行。 因此,举例来说,如果我有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的水平。 但在那之后的处理时间爆炸(它可以在较低的水平,如果有在水平更大量的值)。
如果我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
...
您的问题,看起来像一个“ 物料清单 ”的问题(BOM)。 每个候选条件合理的情况可以表示为一个层级化体系。
Transportation
|
Type
|
Accessories
|
Trailer Wheels Propeller Parachute
读你的问题,色彩是不是约束,因此不需要进行intregrated来约束树。
SQL Server 2008提供了一个非常紧凑和快速的类型编码这些类型的层次结构:HierarchyId的类型 。
使用查找表HierarchyId的,你可以很容易地定义你的约束,回答该方案的有效性问题,并提取相应的方案结果。
BOM分辨率HierarchyId的一个很好的例子可以在阅读MSDN杂志,2008年9月