Come modellare questa[Reti, dettagli in post] nel database per l'efficienza e la facilità d'uso?

StackOverflow https://stackoverflow.com/questions/1056672

  •  20-08-2019
  •  | 
  •  

Domanda

Linkedin, quando si visita someones profilo si può vedere come si sono collegati ad essi.Credo che linkedin mostra fino a 3 collegamenti a livello se non di più, qualcosa di simile

shabda -> Foo utente, bar utente, baz utente -> Joel connessione -> Joel

Come posso rappresentare presente nel database.

Se io modello,

User
  Id PK
  Name Char

Connection
  User1 FK
  User2 FK

Quindi per trovare la rete, tre livelli di profondità, ho bisogno di tutta la mia connessione, le loro connessioni, e le loro connessioni, e poi vedere se l'utente corrente non c'è.Questo, ovviamente, sarebbe molto inefficiente con DB di qualsiasi dimensione, e probabilmente scomodo per lavorare con come bene.

Dal momento che, collegati in posso vedere questa rete, su qualsiasi profilo ho la visita, non credo che questo è precalcolato sia.

L'altra cosa che mi viene in mente è probabilmente questo è meglio non memorizzati in un DB relazionale, ma poi quale sarebbe il modo migliore per conservare e recuperare?

È stato utile?

Soluzione

Il mio consiglio sarebbe quello di utilizzare un grafico database.Sembra che ci sia solo una implementazione attualmente disponibili, e che Neo4j.E ' scritto in Java, ma ha associazioni di Ruby e Scala (Python in corso).

Se non conosci Java, probabilmente non sarà in grado di trovare nulla di simile in qualsiasi altra piattaforma (ancora), purtroppo.Tuttavia, se si conosce il Java (o almeno disposti a imparare), è valsa la pena.(Tecnicamente non c'è nemmeno bisogno di imparare il Java a causa di Ruby/Python bindings.) Neo4j è stato costruito esattamente quello che stai cercando di fare.Devi passare attraverso un sacco di problemi cercando di implementare questo in un database relazionale, quando dovresti essere in grado di fare la stessa identica cosa, solo poche righe di codice Java, e anche in modo molto più efficiente.

Se questo non è un'opzione, ho ancora consiglia di guardare gli altri tipi di database come oggetto database.I database relazionali non erano costruite per questo genere di cose, e devi passare attraverso più dolore cercando di farlo in un RDBMS che con il passaggio a un diverso tipo di database e l'apprendimento.

Altri suggerimenti

Non vedo perché non c'è niente di sbagliato con l'utilizzo di un database relazionale per questo.Le tabelle definite in questione sono un ottimo inizio.Con la corretta ottimizzazione sarete in grado di mantenere le prestazioni bene in mano.Io personalmente penso che si avrebbe bisogno di qualcosa di grave per giustificare il passaggio da un versatile prodotto mainstream.Avrete probabilmente bisogno di un RBDMS nel progetto e comunque ci sono un ineguagliabile quantità di legittime scelte in molte fasce di prezzo (anche gratis).Avrai qualità la documentazione, il supporto sarà disponibile, e avrete una grande quantità di altamente qualificati sviluppatori, disponibile al lavoro in piscina.

Per quanto riguarda questo modello di auto-relazioni (utente unito ad altri utenti), mi consiglia di guardare in query ricorsive.Che ti impediscono di eseguire una cascata di singole query per trovare i 3 livelli di relazioni.Si consideri il seguente SQL Server metodo per l'esecuzione di query ricorsive con Cte.

http://msdn.microsoft.com/en-us/library/ms186243.aspx

Esso consente di specificare a quale profondità si vuole andare con il MAXRECURSION suggerimento.

A quel punto, è necessario iniziare a pensare di modi per ottimizzare.Che inizia con standard di best practice per la creazione di tabelle con gli indici appropriati e di manutenzione, etc.Si finisce inevitabilmente con la denormalizzazione.Che è una di quelle cose da fare solo una volta che hai già provato tutto il resto, ma se si sa cosa si sta facendo e usare buone pratiche quindi il guadagno di prestazioni sarà significativo.Ci sono molte risorse su internet per aiutarvi a conoscere la denormalizzazione, solo guardare in su.

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