SQL Server несколько запросов ко многим ко многим - PullRequest
0 голосов
/ 11 октября 2010

В настоящее время у меня есть одна главная таблица с несколькими другими таблицами, связанными с ней через соединения «многие ко многим» (с таблицами соединений). Приложение, использующее эту базу данных, должно иметь функцию поиска, которая будет распечатывать несколько строк, соответствующих определенным критериям, включая все значения в таблицах объединения. Значения из таблиц соединения также должны быть ссылками, которые позволят искать все другие строки, соответствующие этому значению. Я пытаюсь понять, как это сделать, не облагая налогом базу данных.

Вот пример структуры таблицы

**Metrics (Main Table)** 
MetricID (pk) 
Metric

**Domains (ValueList Table)** 
DomainID (pk) 
Domain

**MetricsDomains (Join Table)** 
MetricsDomainsID (pk) 
MetricID (fk) 
DomainID (fk)

**MetricTypes (ValueList Table)** 
MetricTypeID (pk) 
MetricType

**MetricsMetricTypes (Join Table)** 
MetricMetricTypesID (pk) 
MetricID (fk) 
MetricTypeID (fk)

**Studies (ValueList Table)** 
StudyID (pk) 
Study

**MetricsStudies (Join Table)** 
MetricsStudiesID (pk) 
MetricID (fk) 
StudyID (fk)

Когда кто-то ищет метрику по различным критериям, он должен получить вывод в табличном формате, который выглядит примерно так:

Metric1 | Description | Study1, Study2, Study3 | MetricType1, MetricType2 | Domain1, Domain2
Metric2 | Description | Study5, Study2, Study4 | MetricType2, MetricType3 | Domain5, Domain9

Метрика будет являться ссылкой на полное описание Метрики. Однако, кроме того, исследования (т. Е. Исследование 1, исследование 2, исследование 3 и т. Д.) И MetricTypes (MetricType1, Metric2 и т. Д.) И домены (Domain1, Domain 2 и т. Д.) Также должны быть ссылками, которые при нажатии на него будет выполнен новый поиск всех других метрик, которые содержат это исследование, или тип, или домен. Это наводит меня на мысль, что мне также понадобится первичный ключ исследования, тип или область, в дополнение к тексту, чтобы поместить его в href.

Во всяком случае, учитывая, что один поиск может вернуть более 20 метрик, мне нужно выяснить, является ли хороший способ написать оптимизированный запрос для возврата результатов нескольких объединений «многие ко многим». Я знаю, что объединение всех этих таблиц в одном запросе обычно приводит к декартовому произведению всех объединений, но я не уверен, есть ли другой способ сделать это. Я также читал о том, как можно вернуть результаты многие-ко-многим в виде списка через запятую в поле, используя такой метод:

SELECT m.MetricID, Description, 
    STUFF((
    SELECT ', ' + s.Study
    FROM Studies s, Metrics_Studies ms 
    WHERE s.StudyID = ms.StudyID AND ms.MetricID = m.MetricID
    ORDER BY s.Study
    FOR XML PATH('')
    ),1,1,'') as Study, 
FROM Metrics m 
WHERE Metric_PK = 13

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

Любая помощь будет оценена.

Спасибо!

1 Ответ

1 голос
/ 11 октября 2010

Я бы порекомендовал сделать это сначала со своими мульти-соединениями - только тогда вы узнаете, достаточно ли хороша производительность.Как всегда, вам следует остерегаться преждевременной оптимизации.После того как ваш запрос выполняется правильно для вашей нормализованной модели, вы можете проверить план запроса и т. Д. Это может подчеркнуть, что вам нужно сгладить несколько ваших объединений, в этом случае вам, вероятно, придется хранить данные в двух разныхформаты, один для отчетов / один для поиска и т. д. Но сначала нужно посмотреть, действительно ли производительность приемлема из коробки.Надеюсь, это поможет.

...