Дизайн, который кратко моделирует вашу проблему - это всегда хорошее начало. Чрезмерное обобщение модели данных может привести к проблемам с производительностью. Например, я слышал сообщения о проектах, стремящихся к сверхгибкости, которые используют СУБД в качестве тупого хранилища «имя / значение» - и в результате производительность была ужасающей.
Как только будет создан хороший дизайн, используйте инструменты, предоставляемые СУБД, чтобы помочь ему достичь хорошей производительности. PK одного поля (без композитов), но составные бизнес-ключи в качестве индекса с уникальным ограничением, использование соответствующих типов данных, например, использование соответствующих числовых типов для числовых значений, а не char или аналогичных. Следует также учитывать физические атрибуты оборудования, на котором работает СУБД, поскольку основную часть времени запроса часто составляет дисковый ввод-вывод - но, разумеется, не принимайте это как должное - используйте профилировщик, чтобы узнать, куда идет время .
В зависимости от соотношения обновления / запроса, материализованные представления / индексированные представления могут быть полезны для повышения производительности для медленно выполняющихся запросов. Альтернатива бедному человеку состоит в том, чтобы использовать триггеры для вызова процедуры, которая заполняет таблицу результатом медленного выполнения, редко изменяемого представления.
Оптимизация запросов - это черное искусство, поскольку оно часто зависит от базы данных, но здесь приведены некоторые практические правила - Оптимизация SQL .
Наконец, хотя, возможно, и за пределами предполагаемой области вашего вопроса, используйте хороший уровень доступа к данным в вашем приложении и избегайте соблазна накатывать свои собственные - существуют надежно протестированные и эффективные реализации, доступные для всех основных языков. Использование кэширования на уровне доступа к данным, на среднем уровне и на уровне приложений может значительно повысить производительность.