Le gravi carenze con disegni di database Entità-attributo-valore in SQL tutti sembrano essere legati ad essere in grado di interrogare e riferire sui dati in modo efficiente e rapido. La maggior parte delle informazioni che ho letto sull'argomento mettono in guardia contro l'implementazione dell'EAV a causa di questi problemi e della comunanza di query/reporting per quasi tutte le applicazioni.Come superare le carenze nei rapporti dal database EAV?
Attualmente sto progettando un sistema in cui i campi per una delle entità non sono noti in fase di progettazione/compilazione e sono definiti dall'utente finale del sistema. L'EAV sembra essere adatto a questo requisito, ma a causa dei problemi che ho letto, sono titubante nell'implementarlo in quanto vi sono anche alcuni requisiti di reporting piuttosto pesanti per questo sistema. I penso Ho escogitato un modo per aggirare questo, ma vorrei porre la domanda alla comunità SO.
Dato che il tipico database normalizzato (OLTP) non è sempre l'opzione migliore per l'esecuzione dei report, una buona pratica sembra avere un database "di report" (OLAP) in cui vengono copiati i dati dal database normalizzato, indicizzato in modo estensivo e probabilmente denormalizzato per facilitare le query. È possibile utilizzare la stessa idea per ovviare alle carenze di un progetto EAV?
L'aspetto negativo principale che vedo sono la maggiore complessità di trasferire i dati dal database di EAV per la rendicontazione, si può finire per dover modificare le tabelle del database di report come nuovi campi sono definiti nel database EAV. Ma questo è difficilmente impossibile e sembra essere un compromesso accettabile per la maggiore flessibilità data dal design EAV. Questo svantaggio esiste anche se utilizzo un archivio dati non SQL (ad esempio CouchDB o simile) per l'archiviazione dei dati principale poiché tutti gli strumenti di reporting standard si aspettano un back-end SQL su cui interrogare.
fare i problemi con i sistemi EAV per lo più andare via se si dispone di un database di report separato per l'interrogazione?
EDIT: Grazie per i commenti finora. Una delle cose importanti del sistema su cui sto lavorando è che sto solo parlando dell'utilizzo dell'EAV per una delle entità, non di tutto nel sistema.
L'intero nocciolo del sistema è quello di essere in grado di estrarre dati da più fonti disparate che non sono conosciute in anticipo e scricchiolare i dati per ottenere alcuni dati "più noti" su una particolare entità. Quindi ogni "campo" con cui ho a che fare è multivalore e mi viene anche richiesto di tenere traccia della cronologia per ciascuno di essi. Il design normalizzato per questo finisce con l'essere 1 tavolo per campo, il che rende comunque l'interrogativo un po 'doloroso.
Ecco gli schemi di tabella ei dati di esempio che sto guardando (ovviamente cambiato da quello su cui sto lavorando, ma penso che illustra il pozzo punto):
Tabelle EAV
Person
-------------------
- Id - Name -
-------------------
- 123 - Joe Smith -
-------------------
Person_Value
-------------------------------------------------------------------
- PersonId - Source - Field - Value - EffectiveDate -
-------------------------------------------------------------------
- 123 - CIA - HomeAddress - 123 Cherry Ln - 2010-03-26 -
- 123 - DMV - HomeAddress - 561 Stoney Rd - 2010-02-15 -
- 123 - FBI - HomeAddress - 676 Lancas Dr - 2010-03-01 -
-------------------------------------------------------------------
tabella di rapporto
Person_Denormalized
----------------------------------------------------------------------------------------
- Id - Name - HomeAddress - HomeAddress_Confidence - HomeAddress_EffectiveDate -
----------------------------------------------------------------------------------------
- 123 - Joe Smith - 123 Cherry Ln - 0.713 - 2010-03-26 -
----------------------------------------------------------------------------------------
Progettazione normalizzato
Person
-------------------
- Id - Name -
-------------------
- 123 - Joe Smith -
-------------------
Person_HomeAddress
------------------------------------------------------
- PersonId - Source - Value - Effective Date -
------------------------------------------------------
- 123 - CIA - 123 Cherry Ln - 2010-03-26 -
- 123 - DMV - 561 Stoney Rd - 2010-02-15 -
- 123 - FBI - 676 Lancas Dr - 2010-03-01 -
------------------------------------------------------
Il campo "Fiducia" qui viene generata utilizzando la logica che non può essere espresso facilmente (se non del tutto) utilizzando SQL quindi la mia operazione più comune oltre l'inserimento di nuovi valori verranno tirando TUTTI i dati su una persona per tutti i campi in modo da poter generare il record per la tabella di rapporto.Questo è in realtà più semplice nel modello EAV poiché posso eseguire una singola query. Nella progettazione normalizzata, finisco per dover eseguire 1 query per campo per evitare che un massiccio prodotto cartesiano li unisca tutti insieme.
Memorizzare le informazioni in xml sarebbe meglio. Come sempre si può interrogare usando XQuery anche se SQL. Lo abbiamo fatto con successo per la nostra applicazione. – Fahad