Le opzioni 1, 2 e 3 condividono un difetto molto grave:devi modificare lo schema della tabella sottostante quando qualcuno inventa un nuovo attributo. Nel caso dell'opzione 1 il problema è aggravato dalla possibilità che venga introdotto un nuovo tipo di attrezzatura. Quanto sei sicuro che l'insieme di attributi sia fisso per sempre? Quanto sarai felice di prendere interruzioni o dire al cliente che no, non puoi avere un nuovo attributo?
Se è molto probabile che tu esegua query sugli attributi comuni, potresti provare un ibrido di 3 e 4, con un trattino di 2 inserito nella divisione del tipo di attributo piuttosto che del tipo di attrezzatura, che sembra molto più volatile. L'opzione 4, se ho capito bene, è una versione in forma normale dell'opzione 1 che risolve tutti i suoi problemi intrinseci (scarsità e fragilità).
INVENTORY( id*, model, manufacturer, serial )
ATTRIBUTE( id*, name, type, description )
INVENTORY_FACT_STRING( inv_id*, attr_id*, value )
INVENTORY_FACT_NUMBER( inv_id*, attr_id*, value )
INVENTORY_FACT_LIST_STRING( inv_id*, attr_id*, ordinal*, value )
ecc.