Mysql
 sql >> Database >  >> RDS >> Mysql

Progettazione della tabella entità-attributo-valore

Offrirò un'opinione contraria alla maggior parte dei commenti su questa domanda. Mentre EAV è MALE per tutti i motivi che puoi trovare ampiamente spiegati molte volte qui su SO e DBA.SE e altrove, esiste un'applicazione davvero comune per la quale la maggior parte delle cose che non vanno con EAV sono in gran parte irrilevanti e i (pochi) vantaggi di Gli EAV sono molto pertinenti. Tale applicazione è cataloghi di prodotti online.

Il problema principale con EAV è che non consente al database di fare ciò che è veramente bravo a fare, il che è aiutare a dare un contesto adeguato a diversi attributi di informazioni su entità diverse disponendole in uno schema . Avere uno schema porta molti, molti vantaggi in merito all'accesso, all'interpretazione e all'applicazione dell'integrità dei dati.

Il fatto sui cataloghi di prodotti è che gli attributi di un prodotto sono quasi del tutto irrilevanti per il sistema di cataloghi si. I sistemi di catalogo prodotti fanno (al massimo) tre cose con gli attributi del prodotto.

  1. Mostra agli utenti finali gli attributi del prodotto in un elenco nel formato:{attribute name}:{attribute value}.

  2. Visualizza gli attributi di più prodotti in una griglia di confronto in cui gli attributi di prodotti diversi sono allineati l'uno rispetto all'altro (i prodotti sono generalmente colonne, gli attributi sono generalmente righe)

  3. Guida le regole per qualcosa (ad es. i prezzi) in base a particolari combinazioni di attributi/valori.

Se tutto ciò che il tuo sistema fa è rigurgitare informazioni semanticamente irrilevanti (per il sistema), lo schema per queste informazioni è sostanzialmente inutile. In effetti lo schema si intromette in un catalogo di prodotti online, soprattutto se il tuo catalogo ha molti tipi diversi di prodotti, perché devi sempre tornare allo schema per armeggiare con esso per consentire nuove categorie di prodotti o tipi di attributi.

A causa del modo in cui viene utilizzato, anche il tipo di dati di un valore di attributo in un catalogo prodotti non è necessariamente (di vitale importanza). Per alcuni attributi potresti voler imporre vincoli, come "deve essere un numero" o "deve provenire da questo elenco {...}". Dipende da quanto sia importante la coerenza degli attributi per il tuo catalogo e da quanto elaborata vuoi che sia la tua implementazione. Guardando i cataloghi dei prodotti di diversi rivenditori online, direi che la maggior parte è pronta a barattare la semplicità con la coerenza.

Sì, EAV è malvagio, tranne quando non lo è.