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

Troppi tavoli; MySQL può utilizzare solo 61 tabelle in un join

Stai utilizzando un design EAV e stai cercando di ricostruire una singola riga da un numero variabile di attributi. Questo indica una delle tante mine antiuomo che incontrerai utilizzando il design EAV:c'è un limite pratico al numero di join che puoi eseguire in una singola query SQL.

Specialmente in MySQL -- c'è un limite rigido, come hai scoperto. Ma anche in altri marchi RDBMS esiste un limite effettivo perché il costo dei join è geometrico rispetto al numero di tabelle.

Se utilizzi EAV, non provare a ricostruire una riga in SQL come se avessi un design di database convenzionale. Invece, recupera gli attributi come righe, ordinati in base all'ID entità. Quindi post-elaborali nel codice dell'applicazione. Ciò significa che non puoi eseguire il dump dei dati in un solo passaggio:devi scrivere il codice per scorrere le righe degli attributi e riformare ogni riga di dati prima di poterla generare.

EAV non è un design di database conveniente. Ci sono molti svantaggi costosi nell'usarlo e ne hai appena colpito uno.

Vedi http://www.simple-talk.com/opinion /pezzi-di-opinione/cattivo-carma/ per una bella storia su come l'utilizzo di EAV abbia condannato un'azienda.

E vedi anche http://en.wikipedia.org/wiki/Inner-platform_effect perché EAV è un esempio di questo Anti-pattern.

Comprendo la necessità di supportare un insieme dinamico di attributi per prodotto in un catalogo. Ma EAV ucciderà la tua applicazione. Ecco cosa faccio per supportare gli attributi dinamici:

  • Definisci una colonna reale nella tabella di base per ogni attributo comune a tutti i tipi di prodotto. Nome del prodotto, prezzo, quantità in stock, ecc. Lavora sodo per immaginare il prodotto canonico entità in modo da poter includere il maggior numero possibile di attributi in questo set.

  • Definisci un'altra colonna di tipo TEXT per tutti gli attributi aggiuntivi di ogni dato tipo di prodotto. Archivia in questa colonna come LOB serializzato degli attributi, nel formato che preferisci:XML, JSON, YAML, la tua DSL fatta in casa, ecc.

    Trattalo come una singola colonna nelle tue query SQL. Qualsiasi ricerca, ordinamento o visualizzazione che devi eseguire in base a questi attributi richiede di recuperare l'intero TEXT blob nella tua applicazione, deserializzalo e analizza gli attributi utilizzando il codice dell'applicazione.