【问题标题】:How to efficiently prune data如何有效地修剪数据
【发布时间】:2012-08-09 23:17:04
【问题描述】:

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

【问题讨论】:

  • 数据库表是什么样的?
  • 嗨,戈登。目前,实体不是分开的。它们存储在相邻列表(父子)中,并且限制在集合中定义......所以(构成限制集的限制组合)

标签: c# sql-server database sql-server-2008


【解决方案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
     ...

【讨论】:

    【解决方案2】:

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

                Transportation
                       |
                      Type
                       |
                   Accessories
                       |
          Trailer Wheels Propeller Parachute
    

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

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

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

    BOM 解析与 HierarchyId 的一个很好的例子可以在MSDN Magazine, september 2008

    上阅读

    【讨论】:

    • 谢谢@PulsarBlow 我过去曾尝试过层次结构。我会试一试
    猜你喜欢
    • 2014-03-27
    • 1970-01-01
    • 2020-09-05
    • 1970-01-01
    • 2020-03-21
    • 1970-01-01
    • 2011-05-27
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多