Domanda

Ho un database MySQL, e un tavolo particolare in quello del database deve essere auto-riferimento, in modo uno-a-molti. Per la scalabilità, ho bisogno di trovare la soluzione più efficiente possibile. I due modi più evidente per me sono:

1) Aggiungere un campo di testo al tavolo, e memorizzare un elenco di chiavi primarie serializzato là

2) Mantenere un tavolo linker, con ciascuna fila essendo uno-a-uno.

In caso # 1, io vedere la tabella crescita molto ampia (usando un'analogia spaziale), tranne nel caso in # 2, che vedi tabella linker cresce a un gran numero di righe, che rallenterebbe ricerche (da di gran lunga l'operazione più comune).

Qual è il modo più efficiente in cui implementare un tale rapporto uno-a-molti in MySQL? O, forse, c'è una soluzione molto più sano mantenere i dati di tutti direttamente sul filesystem in qualche modo, oppure qualche altro motore di storage?

È stato utile?

Soluzione

Basta tenere un tavolo per i "molti", con una colonna chiave per la tabella primaria.

I quarantee avrete un sacco di altri problemi più importanti da risolvere prima che si esegue in efficienza o di capacità in un DBMS relazionale di livello industriale standard.

IMHO la seconda opzione più probabile (con numerosi prodotti alternativi) è quello di utilizzare un ISAM.

Altri suggerimenti

Se avete bisogno di fare attraversamenti profondi / ricorsivi nei dati, un database grafico come Neo4j (dove ho' m sulla squadra) è una buona scelta. Troverete alcune informazioni in questo articolo In caso di andare oltre database relazionali? e in questo post ad alta scalabilità . Per un caso d'uso che potrebbe essere simile al tuo, leggere questo filo su MetaFilter . Per informazioni sulle associazioni di lingua e di altre cose che si possono anche trovare le Neo4j wiki e mailing list utile.

Non tanto una risposta, ma un paio di domande e un possibile approccio ....

Se si vuole fare la tabella di sé riferimento e utilizzare un solo campo ... ci sono alcune opzioni. Un maskable calcolato 'registrati' campo descrive un modo per associare molte righe con l'altro.

La soluzione migliore sarà probabilmente in considerazione la natura dei dati e le relazioni? Qual è la natura dei dati e le ricerche? Che tipo di rapporto stai cercando di contenere? Associazione? Relazionato? Parent / bambini?

Il mio primo commento è che si otterrà le risposte migliori se si può descrivere come verranno utilizzati i dati (frequenza di aggiunge / aggiornamenti vs ricerche, aggiunge vs aggiornamenti, ecc) oltre a quello che hai già descritto. Detto questo, il mio primo pensiero sarebbe quello di andare solo con una rappresentazione generica di


CREATE  TABLE IF NOT EXISTS one_table (
  `one_id` INT UNSIGNED  NOT NULL AUTO_INCREMENT
           COMMENT 'The The ID of the items in the one table' ,
  ... other data
)

CREATE  TABLE IF NOT EXISTS many_table (
  `many_id` BIGINT UNSIGNED NOT NULL AUTO_INCREMENT
            COMMENT 'the id of the items in the many table',
  `one_id` INT UNSIGNED  NOT NULL
           COMMENT 'The ID of the item in the one table that this many item belongs to' ,
  ... other data
)

Fare in modo, ovviamente, per creare un indice sulla one_id in entrambe le tabelle.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top