2012-08-09 7 views
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 уровней, построив динамические подобные утверждения, чтобы я мог проверить полученный сценарий. Но после этого время процесса взрывается (что может быть на более низких уровнях, если на уровне было намного больше значений).

+0

Что таблицы баз данных выглядеть? –

+0

Привет Гордон. В настоящее время сущности не являются отдельными. Они хранятся в соседнем списке (родительский ребенок), а ограничения определяются в наборах ... так что (комбинации ограничений, которые составляют набор ограничений) – scarpacci

ответ

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

Ваша проблема выглядит как «Спецификация материалов» проблема (спецификация). Каждый возможный сценарий может быть представлен как иерархизированная система.

  Transportation 
        | 
        Type 
        | 
       Accessories 
        | 
     Trailer Wheels Propeller Parachute 

Чтение ваш вопрос, цвет не является ограничением, так что не нужно быть intregrated к дереву ограничений.

SQL Server 2008 обеспечивает чрезвычайно компактный и быстрый тип кодирования таких типов: HierarchyId type.

Используя таблицу поиска с HierarchyId, вы можете легко определить свои ограничения, ответить на вопрос о действительности сценария и извлечь соответствующие результаты сценария.

Хорошим примером разрешения BOM с hierarchyid` в можно прочитать на MSDN Magazine, september 2008

+0

Спасибо @PulsarBlow Я уже пробовал иерархию в прошлом. Я дам этот выстрел – scarpacci

Смежные вопросы