2015-12-19 11 views
6

ho una tabella di un'organizzazione come questa:ricerca dati provenienti da tabelle dinamiche che utilizzano Microsoft SQL Server

OrgID | OrgInviteCode | OrgName  | Status | ProjectTableName | InsertOn 
------------------------------------------------------------------------------------------- 
1 | RC12T67  | Organization1 | Active | Project1  | 2015-12-19 15:37:43.333 
2 | BC56uI7  | Organization2 | Active | Project2  | 2015-12-19 15:37:43.333 
3 | ORG1456  | Organization3 | Active | Project3  | 2015-12-19 15:37:43.333 
4 | ORG2856  | Organization4 | Active | Project4  | 2015-12-19 15:37:43.333 

e ho una stored procedure per creare una tabella dinamica per il progetto.

Se una nuova organizzazione viene creato correttamente poi chiamare la stored procedure per creare la tabella di progetto per tale organizzazione.

Ogni organizzazione ha la propria tabella di progetto. Quindi il nome della tabella del progetto è dinamico per ogni organizzazione e il nome è memorizzato nella tabella dell'organizzazione.

Organization1 -> Tavolo Progetto

ProjectID | OrgID | ProjectName | ProjectInvideCode | Address1  | Address2 | City  |State | ZIP  | Country 
------------------------------------------------------------------------------------------------------------------------------- 
1   | 1 | Org1Proj1 | XJ34590   | 235 Harrison St. |   | Syracuse | AK  | 23456234 | US 
2   | 1 | Org1Proj2 | JKI8907   | 35 Sterling St. |   | Syracuse | NY  | 23456456 | US 

Organization2 -> Tavolo Progetto

ProjectID | OrgID | ProjectName | ProjectInvideCode | Address1 | Address2 | City  |State | ZIP | Country 
------------------------------------------------------------------------------------------------------------------------------- 
1   | 2 | Org2Proj1 | RUIO90   | 90 Ram St. |   | Los Angeles | CA | 23456234 | US 
2   | 2 | Org2Proj2 | KLOP907   | 35 Wide St.|   | Chicago  | IL | 23456456 | US 

Attualmente sto lavorando per integrare la funzione di ricerca. Gli utenti o gli utenti anonimi possono cercare i dati in base alla seguente logica:

  • Cerca con nome organizzazione o codice di invito organizzazione.
  • Cerca con nome progetto o codice invito progetto.
  • Ricerca con l'indirizzo del progetto, città, stato, paese

So che è molto semplice trovare i risultati di ricerca nome dell'organizzazione e codice di invito, perché tutto il contenuto è risiede nella stessa tabella.

ma è più complicato per ottenere i risultati di ricerca i progetti (nome o il codice di invito) a causa di nome della tabella dinamica. Ho trovato questo collegamento in How to fetch data from dynamic multiple tables?, quindi penso che non sia una soluzione migliore perché la ricerca deve essere molto veloce.

Il motivo per cui abbiamo separato le tavole di progetto sulla base di organizzazione, perché nel nostro requisito accennano chiaramente che "Abbiamo 1000000 organizzazione, ma ogni organizzazione che ha più di 1 milione di progetti". Spero che tu capisca il concetto che non vogliamo scaricare i progetti 1000000 (Organizzazione) * 1 milione = XXXXXX in un'unica tabella.

Domande:

  • Come possiamo cercare i dati dei progetti in modo efficace?
  • Il nostro concetto di tabella separata è il peggiore? Hai qualche suggerimento da gestire molto meglio?
  • C'è un modo efficace in C#?

strumenti e la tecnologia:

  • Asp.Net 4.5, C#
  • MVC codice 5
  • Entity Framework prima
  • SQL Server 2012
+0

Per curiosità, perché non vuoi scaricare organizzazioni 1M con progetti 1M in una sola tabella? Voglio dire, sembra un sacco di dati, quindi invece di hackerare via con SQL Server e le tabelle 1T, forse hai bisogno di un'architettura di database ad alte prestazioni distribuita? –

+0

@KeithPayne AFAIK non ha senso mantenere i dati in una singola tabella. Sappiamo già che i dati sono molto grandi, quindi mentre costruiamo da zero dobbiamo progettare il database con i dati, la scalabilità, le prestazioni ecc. – Chandru

+0

Quanti tavoli pensi di avere? 1 milione di organizzazioni x 1 milione di progetti = 1 trilione. Vuoi progettare il sistema per gestire 1 trilione di tavoli? Hai controllato le specifiche sui massimi di SQL Server? E poi, come indicizzerai il tuo elenco di tavoli? Un indice ordinato deve essere mantenuto da qualche parte in modo da poter associare la tabella con il progetto org +. Dove verrà memorizzato l'indice? –

risposta

5

Penso che si possa creare VISTA unisce tutte le tabelle di progetto

SELECT 
    REPLACE(
     REPLACE( 
      REPLACE(
      (
       SELECT DISTINCT 'SELECT * FROM Organization O JOIN ' 
        + ProjectTableName 
        + ' PT ON O.OrgId = PT.OrgId WHERE O.OrgId = ' + convert(varchar(10), OrgId) 
        as [text()] FROM Organization 
       FOR XML PATH ('DELIMITER') 
      ), '</DELIMITER><DELIMITER>', ' 
      UNION ALL 
      '), '</DELIMITER>', '') 
    ,'<DELIMITER>', 'CREATE VIEW Organization_Projects 
AS 
') 

deve essere abbastanza vicino a efficienza per le query sulle tabelle di origine.

+0

Pensi che sia molto più semplice in NoSQL come mongodb, cassandra. – Chandru

+0

In generale, io non la penso così. Gli archivi orientati ai documenti sono utili per i dati con schemi dinamici. Nel tuo caso: se ogni organizzazione avesse una tabella di progetto con un insieme di colonne univoco di quello che potrebbe essere utile utilizzare questi depositi. – Ingaz

2

Se si desidera una ricerca più rapida, è possibile farlo compromettendo durante il tempo di inserimento/scrittura. Dei seguenti tre punti:

  • Cerca con nome organizzazione o codice di invito organizzazione.
  • Cerca con nome progetto o codice invito progetto.
  • Ricerca con l'indirizzo del progetto, città, stato, paese

In primo luogo è straigt avanti come hai detto. Diamo un'occhiata a 2 e 3. Vorrei suggerire un modo generico con cui è possibile gestire entrambi i punti, lascia prendere l'indirizzo come esempio.

  1. Crea indirizzo tabella con colonna AddressId e Address, memorizza solo l'indirizzo univoco in questa tabella. È possibile effettuare l'indirizzo come chiave univoca. Memorizza indirizzo nella tabella Organizzazione e Progetto e non indirizzo completo. Ciò consente di risparmiare spazio ed evitare errori di ortografia
  2. Crea tabella OrganisationAddressMap con id colonna, AddressId, ProjectId e OrganisationId. Memorizza solo una riga univoca in questa tabella
  3. Quando si cerca l'indirizzo, cercare nella tabella sopra due per identificare projectId e OrganizationId rilevanti. E poi sulla base di questi due id query tabella corretta.

Nello scenario di cui sopra si sta eseguendo la ricerca di un numero di righe per indirizzo molto inferiore. Allo stesso modo, crea due tabelle per ogni termine di ricerca come nome del progetto, codice di invito al progetto, città, stato e paese.

+0

Grazie per la risposta. Mi aiuta. Quindi mi stai suggerendo di avere tutti i progetti in un'unica tabella. Ho ragione io? Abbiamo una casella di ricerca e gli utenti possono cercare (Nome Org o OrglnviteCode o ProjName o ProjlnviteCode o Indirizzo ecc.) E dobbiamo ottenere il risultato in base alle logiche che ho menzionato. Secondo la tua soluzione stai dividendo le colonne e non le righe. – Chandru

+0

Sì, avere tutti i progetti in una tabella con una voce univoca sarà molto veloce per la ricerca. Insieme alla casella di ricerca puoi dare un menu a tendina per selezionare il campo in cui l'utente desidera effettuare la ricerca, per rendere più veloce la ricerca di ca. 8 volte durante la ricerca in uno solo degli otto campi e non tutti. Puoi anche avere un'opzione come "tutto" nel menu a discesa, nel qual caso cercherai in tutte le tabelle una per una. Se ritieni che questa sia la risposta corretta, contrassegnala come risposta. – techExplorer