2

我目前正在解决一个工作问题,我需要根据用户定义的限制获取数据并修剪生成的场景。我已经尝试了很多东西,但似乎无法让任何东西像我想要的那样高效运行。我可能必须在数据库之外运行,以便可以扩展运行,但我认为如果可能的话,我应该尝试在数据库内部执行。因此,例如,如果我有 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 个级别使其真正发挥作用,我可以检查派生的场景。但在那之后,处理时间会爆炸(如果级别中有更多的值,它可能会在较低级别)。

4

2 回答 2

1

您的问题看起来像“物料清单”问题 (BOM)。每个可能的有效场景都可以表示为一个分层系统。

            Transportation
                   |
                  Type
                   |
               Accessories
                   |
      Trailer Wheels Propeller Parachute

阅读您的问题,颜色不是约束,因此不需要将其集成到约束树中。

SQL Server 2008 提供了一种极其紧凑和快速的类型来对这些层次结构进行编码:HierarchyId 类型

使用带有 HierarchyId 的查找表,您可以轻松定义约束、回答场景有效性问题并提取相应的场景结果。

可以在2008 年 9 月的 MSDN 杂志上阅读使用 HierarchyId进行 BOM 解析的一个很好的示例

于 2012-08-10T00:43:58.783 回答
1

如果我理解正确,目标是生成满足特定标准的场景。场景将由属性组合生成。

假设每个实体都在一个单独的表中,您可以按以下方式执行查询:

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
     ...
于 2012-08-10T13:06:48.937 回答