Wie bei den meisten Dingen, "es kommt darauf an". Wenn die Joins relativ inkonsequent sind (dh eine kleine Anzahl von Joins auf gut verschlüsselten Daten) und Sie besonders komplexe Daten speichern, ist es möglicherweise besser, nur bei der komplexeren Abfrage zu bleiben.
Es ist auch eine Frage der Frische. In vielen Fällen besteht der Zweck vieler Verknüpfungen darin, sehr unterschiedliche Daten zusammenzuführen; das heißt, Daten, die in ihrer relativen Frische stark variieren. Es kann erhebliche Komplexität und Overhead hinzufügen, um eine Schlüssel-Wert-Paar-Tabelle synchronisiert zu halten, wenn ein kleines Stück der Daten über eine große Anzahl von Paaren aktualisiert wird. Systemkomplexität kann oft als eine Form von Leistungskosten angesehen werden; Die Zeit, das Risiko und die Kosten, um ein komplexes System zu ändern, ohne die Leistung zu beeinträchtigen, sind oft viel größer als ein einfaches.
Die beste Lösung ist immer Code, der so einfach funktioniert wie Sie können. In den meisten Fällen würde ich sagen, dass dies bedeutet, ein vollständig normalisiertes Datenbankdesign zu erstellen und den Mist daraus zu machen. Besuchen Sie Ihr Design nur nach Leistung wird ein offensichtliches Problem. Wenn Sie das Problem analysieren, wird es auch offensichtlich, wo die Probleme liegen und was getan werden muss, um sie zu beheben. Wenn es Joins reduziert, dann sei es so. Sie werden wissen, wann Sie es wissen müssen.
Ich stimme nicht ganz mit dem "... schließen Sie den Mist daraus." Teil. Meine Erfahrung sagt mir, sollte sinnvoll gemacht werden. Zu viel Normalisierung ist fast immer eine schlechte Sache. –