2010-10-27 13 views
7

Voglio memorizzare un array di valori interi in una tabella di database SQL (SQLServer 2005), se possibile utilizzando una singola colonna.Memorizzazione dell'array di valori interi in SQL Server

L'array intero avrà una lunghezza di 7560 valori.

Sto usando una objectdatasource, il tipo di dati dovrebbe essere compatibile con i parametri generati da un tableadapter.

grazie per l'aiuto :)

+0

perché non creare un campo di testo grande e separare i valori con una virgola? oppure utilizzare un BLOB come bitmap (4 byte per int) o in alternativa creare una tabella con 7561 campi: P – joni

risposta

15

di avere almeno due scelte:

  • Conservarlo come una virgola elenco di valori separati.
  • Utilizzare una tabella separata e memorizzare un valore per riga, con una chiave esterna che punta alla tabella.

Se si desidera normalizzare il database, si dovrebbe prendere la seconda opzione.

+4

@OP, io consiglio l'opzione due. – Brad

+0

Grazie per la tua risposta! se normalizzo il database finirò con milioni di righe (forse più di 50 milioni). Non sono sicuro che il database possa gestirlo senza problemi di prestazioni. – spoekes

+1

@spoekes: Penso che sia necessario considerare i casi d'uso per decidere quale soluzione è meglio per voi.Hai sempre bisogno di recuperare e modificare l'intero elenco in una sola volta? Quindi usare una singola cella probabilmente sta bene. A volte ti interesserà cambiare un solo elemento o controllare se un elemento è in una lista? Molto probabilmente la normalizzazione ti darà prestazioni migliori. –

0

Solo se necessario! È possibile creare facilmente un'altra tabella che contiene la chiave esterna nella tabella e una colonna int.

Se si desidera mantenere in SQL Server una colonna, è necessario utilizzare il tipo di colonna IMAGE o VARBINARY (MAX) poiché la lunghezza dei dati supera 8 KB. Questo memorizzerà ogni int come valore binario a 4 byte.

Che cos'è ObjectDataSource?

+0

Grazie per la risposta! Ci sono degli svantaggi usando VARBINARY (MAX) o IMAGE? ObjectDataSource è Data Access Layer che genera metodi per il recupero dei dati. – spoekes

+0

Le prestazioni dei campi VARBINARY (MAX) o IMAGE non sono così buone, sebbene siano sufficienti. – Aliostad

5

Giusto: 1NF non stabilisce valori ripetuti. Ogni elemento nell'array 7560-elemento proposto appartiene alla sua stessa riga.

Mettendo ogni elemento nella propria riga, si dà all'RDBMS la possibilità di fare cose che non può fare altrimenti, ad esempio: calcolare statistiche sul set, verificare che ciascun elemento sia conforme alle regole del dominio, calcolare le differenze tra due set , conta/seleziona insiemi che condividono alcune caratteristiche.

finirò con milioni di righe (forse più di 50 milioni). Non sono sicuro che il database possa gestirlo senza problemi di prestazioni.

Questo non è particolarmente molti, e non sarà necessario occuparsi di tutti i 50 milioni la maggior parte del tempo. Calcola tu stesso quanti accessi sono necessari per cercare un albero binario per trovare un record in un miliardo. La risposta potrebbe sorprendervi.

+0

non è necessario realizzare tutto. Per il tagging, credo, dovresti innanzitutto archiviarlo come array, e poi per scopo di performance e di report, creare un'altra tabella per facilitare ciò. Questo probabilmente è esattamente il motivo per cui alcune persone scelgono mongoDB. Ma in realtà è perché la gente dice che non dovresti fare questo o quello che l'ha causato IMHO. – windmaomao

0

Lo memorizzerei nel valore separato da virgola se i dati NON SONO CORRELATI a nessun'altra tabella (esempio, i valori che vuoi elaborare in qualche modo), se lo sono (prodotti in una fattura, ad esempio) dovresti creare un'altra tabella con una chiave esterna.

Greatings

Problemi correlati