Wie schon gesagt: The key, the whole key and nothing but the key, so help me Codd!
Nach korrekter Normalisierung der Datenstrukturen (3. NF) gibt es nichts doppelt. Alles, was mehrmals vorkommt, wird auf einen eindeutigen Key reduziert. Du löst alle transitiven Abhängigkeiten.
So wie du es aufbauen würdest, hättest du sowohl in der Tabelle Audi als auch in der Tabelle VW jetzt einen Status "Viertürer", einen für "Diesel",... Deine beiden Tabellen wären um genau eine Spalte schlanker als deine verschmolzene Tabelle, nämlich um die Hersteller-ID. Beide Hersteller bauen 3-5 - Türer. Beide bieten Kompakt- bis Luxusklasse an. Beide vertreiben Diesel & Benzin in verschiedenen Hubraumgrößen....
Was du dir dabei aber schlichtweg versaust ist: "Liste mir alle Dreitürer mit >2l (respektive > 1990ccm, übliches Geschummel) Hubraum und > 120kW auf, unabhängig vom Hersteller". Diese Abfrage spuckt mir dann genauso einen Focus RS wie einen Golf GTI oder Scirocco aus. Nein, du müsstest jede Tabelle einzeln abfragen und am Ende die Ergebnismengen noch vereinen. Hochgradig ineffizient.
Also ja: "SELECT * FROM cars WHERE `class`='compact' AND `engine_size` > 1990 AND `engine_power` > 120" ist ein verdammt flotter Query, wenn nur Fahrzeugklasse, Hubraum, Motorleistung etc. jeweils einen Index haben. Sogar wenn man, wie man es sollte, den Hersteller jetzt nur als id listet, und dem entsprechend noch einen JOIN braucht um aus der Hersteller-ID auf den Namen des Herstellers zu schließen, ist es immer noch performant, vorausgesetzt auch die Hersteller-Liste hat anständige Indizes... wobei die ID eh der Primary Key ist, udn außerdem natürlich auch ein Foreign Key mit passenden Constraints