Получение наиболее эффективного запроса на основе нескольких таблиц / первичных и внешних ключей

0

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

Было бы разумнее создать таблицу с именем gateway_classes с fk из таблицы шлюза в каждом классе или сформировать запрос, чтобы каким-то образом отфильтровать именно то, что мне нужно, из моих существующих таблиц, используя массив классов, которые нужно вытащить во время запроса

Здесь мои таблицы: departments_classes | classes_vendors | departments | vendors | classes | products | gateway

Приветствуется любое руководство.

Дополнительная информация: Есть около 350 классов и 18 отделов и 12 страниц шлюза...

Теги:
coldfusion

2 ответа

1
Лучший ответ

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

Если вы не хотите поддерживать эти данные по-другому, чем в настоящее время, вы можете использовать CF-массивы (или структуры) для хранения данных корреляции (которые вам нужно было бы извлечь из db в отдельном запрос), а затем перебирать его по мере создания запроса, который вытягивает классы для данной страницы.

В любом случае все будет хорошо, это больше зависит от того, как вы предпочитаете это делать, и то, что, по вашему мнению, будет проще всего создавать, тестировать и поддерживать.

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

Я видел резкие улучшения скорости в моих запросах (CFQUERYs, работающих против MS SQL) с простым актом ввода индексов.

В MS SQL вы делаете это так:

CREATE NONCLUSTERED INDEX yourIndexName ON yourTableName(yourFieldName)

Надеюсь, это поможет!

  • 0
    Отлично, спасибо. В итоге я использовал CREATE TABLE classes_gateway LIKE departments_classes; INSERT classes_gateway SELECT * FROM department_classes; затем добавил столбец gateway_id . После этого я упорядочил данные по отделам, добавил, где это возможно, соответствующий идентификатор шлюза, а затем вернулся и внес меньшие изменения, специфичные для класса. Наконец, я удалил информацию об отделе, чтобы не было дубликатов данных.
  • 0
    Похоже, ты справился с этим! Отлично сработано!
0

Ваша проблема звучит подобно общему сценарию для определения прав пользователя. Пользователь может принадлежать к какой-либо Группе, у которой есть Права, связанные с ней, или Пользователь может быть назначен Права индивидуально. В вашем случае пользователь является шлюзом, Группа является Департаментом, а права - это классы. Затем шлюз можно связать с любым количеством департаментов и/или классов.

Используя эту модель, вам просто нужно добавить таблицу gateway_classes, как вы описываете, и таблицу gateway_departments.

Затем вы можете использовать UNION, чтобы объединить запрос "шлюзовые классы" с запросом "gateway department" (или, возможно, что-то более элегантным), но я думаю, что эта схема будет нужна вам, не внося никакой избыточной информации.

  • 0
    Спасибо за подтверждение. Я думаю, что вы с Кайлом указываете мне в одном направлении. Я ценю мудрость.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню