У меня есть сайт, на котором некоторые страницы (мы называем их страницами шлюза) свободно базируются на определенных отделах организации. У каждого отдела есть классы, связанные с ним. К сожалению, некоторые мои страницы не связаны с конкретным отделом, но отображают информацию о нескольких классах из отдела, поэтому я не могу просто запросить базу данных строго по отдельности.
Было бы разумнее создать таблицу с именем gateway_classes с fk из таблицы шлюза в каждом классе или сформировать запрос, чтобы каким-то образом отфильтровать именно то, что мне нужно, из моих существующих таблиц, используя массив классов, которые нужно вытащить во время запроса
Здесь мои таблицы:
departments_classes
| classes_vendors
| departments
| vendors
| classes
| products
| gateway
Приветствуется любое руководство.
Дополнительная информация: Есть около 350 классов и 18 отделов и 12 страниц шлюза...
Ваша идея таблицы индексирования звучит так, как будто все будет хорошо. Единственным недостатком является то, что вы должны поддерживать его отдельно, и вы хотите убедиться, что данные, хранящиеся в этой таблице, не дублируются ни в одной из существующих таблиц.
Если вы не хотите поддерживать эти данные по-другому, чем в настоящее время, вы можете использовать CF-массивы (или структуры) для хранения данных корреляции (которые вам нужно было бы извлечь из db в отдельном запрос), а затем перебирать его по мере создания запроса, который вытягивает классы для данной страницы.
В любом случае все будет хорошо, это больше зависит от того, как вы предпочитаете это делать, и то, что, по вашему мнению, будет проще всего создавать, тестировать и поддерживать.
Одна вещь об эффективности - убедитесь, что вы не только связываете свои таблицы с помощью внешних ключей (что помогает поддерживать целостность данных), но также включают (некластеризованные) индексы, что помогает повысить эффективность соединений и поисковых запросов, делает.
Я видел резкие улучшения скорости в моих запросах (CFQUERYs, работающих против MS SQL) с простым актом ввода индексов.
В MS SQL вы делаете это так:
CREATE NONCLUSTERED INDEX yourIndexName ON yourTableName(yourFieldName)
Надеюсь, это поможет!
Ваша проблема звучит подобно общему сценарию для определения прав пользователя. Пользователь может принадлежать к какой-либо Группе, у которой есть Права, связанные с ней, или Пользователь может быть назначен Права индивидуально. В вашем случае пользователь является шлюзом, Группа является Департаментом, а права - это классы. Затем шлюз можно связать с любым количеством департаментов и/или классов.
Используя эту модель, вам просто нужно добавить таблицу gateway_classes, как вы описываете, и таблицу gateway_departments.
Затем вы можете использовать UNION, чтобы объединить запрос "шлюзовые классы" с запросом "gateway department" (или, возможно, что-то более элегантным), но я думаю, что эта схема будет нужна вам, не внося никакой избыточной информации.
CREATE TABLE classes_gateway LIKE departments_classes; INSERT classes_gateway SELECT * FROM department_classes;
затем добавил столбецgateway_id
. После этого я упорядочил данные по отделам, добавил, где это возможно, соответствующий идентификатор шлюза, а затем вернулся и внес меньшие изменения, специфичные для класса. Наконец, я удалил информацию об отделе, чтобы не было дубликатов данных.