Найти все наборы, которые являются подмножеством надмножества в SQL - PullRequest
4 голосов
/ 01 ноября 2010

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

Например, учитывая входной набор A ={1,2,3 ... 50} и набор множеств B = {B1 = {3,5,9,12}, B2 = {1,6,100,123,45} ... B500 = {8,67,450}}, вернуть все B, которые являются подмножеством A.

Я полагаю, что это похоже на поисковую систему, за исключением того, что у меня нет такой роскоши, как множество A маленькое, а B большое;в моем случае B обычно меньше, чем A.

Я нашел похожий вопрос здесь , но мне было интересно, есть ли что-нибудь более эффективное / стандартное.

1 Ответ

3 голосов
/ 01 ноября 2010

Ответ Харпера правильный и элегантный.Безусловно, «стандарт» среди опытных программистов SQL.Требование, конечно, БД должно быть нормализовано: родитель не дублируется;Родитель :: Ребенок имеет два отношения;в таблице Child есть два уникальных индекса (ParentKey, ChildKey) и (ChildKey, ParentKey), «иначе все ставки выключены».Невозможно получить более высокую производительность, чем эта (при условии, что сервер правильно настроен для оборудования и т. Д.).Следующим шагом является 6NF, который обеспечивает значительное увеличение производительности, но вам не нужно идти туда, если вам не нужно.Если ваши B меньше, чем As, это будет очень быстро.

Альтернативой является использование подзапросов.В зависимости от вашего поставщика базы данных, подзапросы (особенно если ваши B меньше, чем ваши) могут быть быстрее.Например.Sybase обрабатывает подзапросы намного лучше, чем MS.

...