Buen punto, pero la solución no es meter todo en una tabla. Puedes usar vistas o, si tu motor lo soporta, tablas particionadas o JSON para los atributos variables. Otra opción: si los atributos específicos son pocos y poco consultados, podrías usar un campo JSONB en PostgreSQL. Eso te da flexibilidad sin romper la normalización del todo. Ejemplo:
CREATE TABLE items (
id INT PRIMARY KEY,
name TEXT,
price DECIMAL,
created_at TIMESTAMP,
type TEXT,
attributes JSONB
);Así no tienes columnas NULL y las consultas simples son rápidas. Para búsquedas complejas sobre atributos, puedes indexar el JSONB.