как оптимизировать булеву функцию? - PullRequest
1 голос
/ 12 июля 2010

Я столкнулся с проблемой оптимизации дизайна базы данных с помощью автоматического механизма. база данных будет включать таблицы, которые связывают произвольные данные с атрибутом например Таблица A содержит все идентификаторы лиц, которые нажали кнопку покупки, Таблица B содержит все идентификаторы, у которых нет возврата, ....

так даны некоторые очень основные MainTables, например A, B, C, D, которые должны быть составлены с помощью операций теории множеств (объединение, пересечение, дополнение) с использованием некоторого графического интерфейса пользователя, что приводит к новым SubsetTables

По мере создания большего количества подмножеств они все больше зависят друг от друга, например, E = (A и B), F = (A и B и C) - оба являются булевыми функциями, и идентификатор человека находится в пределах этого набора или нет

Теперь я пытаюсь оптимизировать запрос к базе данных, который заполняет / запрашивает мою таблицу так, чтобы запрос был не F = (Соединение B, соединение C), а F = (E соединение C), что имеет смысл, поскольку E содержит меньше строк как это уже подмножество

наконец, это означает, что я спрашиваю, какой математический / программный алгоритм, если таковой имеется, может оптимизировать мою проблему со многими наборами и подмножествами (возможно, несколькими сотнями), чтобы я мог эффективно запрашивать и заполнять таблицы

Я уже думал о создании нового подмножества только с использованием информации MainSet и оптимизации этих GUI-созданных подмножеств с использованием алгоритма Карно-Вейча, но это привело бы, например, к. A и B и C. Я не знаю, как сделать второй шаг оптимизации для преобразования (A и B и C) в (E и C) и с еще большей сложностью, что приводит к проблеме поиска наиболее эффективной комбинации (sub) Сета

спасибо за любой совет

1 Ответ

0 голосов
/ 12 июля 2010

Возможно, существует другая причина, по которой вы не можете изменить схему таблицы, однако, если вы можете изменить схему, я рекомендую вместо этого иметь одну таблицу, содержащую идентификаторы всех людей, и иметь логическое (битовые) столбцы для каждой из ваших данных, например:

ID  A  B  C
--- -- -- --
1   1  0  1
2   1  1  0
etc...

Это означает, что сервер базы данных выполнит всю оптимизацию за вас:

-- Select all people in set A
SELECT * FROM MyTable WHERE A = 1

-- Select all people in set E
SELECT * FROM MyTable WHERE A = 1 AND B = 1

-- Select all people in set F
SELECT * FROM MyTable WHERE A = 1 AND B = 1 AND C = 1

(я бы также рекомендовал дать вашим колонкам более подходящие имена)

...