2010-10-07 16 views
6

Qualcuno ha un'idea di che cosa è la migliore pratica per memorizzare un tipo di dati sconosciuto in una tabella. Fondamentalmente avrei bisogno di memorizzare tipi come bit, smallint, int, real e nvarchar nella stessa colonna "value", per una successiva interpretazione da parte di un'applicazione .NET.Memorizzazione di un tipo di dati sconosciuto nel database MS SQL Server

Stavo cercando di ottenere la migliore soluzione possibile per non compromettere le prestazioni o la crescita del database.

Qualche suggerimento?

Grazie in anticipo!

+2

Se si sta seguendo il percorso EAV, suggerisco di leggere il motivo per cui si tratta di una cattiva struttura dati in un database relazionale. vedi: http: //www.simple-talk.com/opinion/opinion-pieces/bad-carma/ Se hai davvero bisogno di farlo, potresti prendere in considerazione una soluzione nosql. – HLGEM

risposta

11

Varchar (max) è probabilmente il modo più semplice per farlo.

sql_variant è stato progettato per questo scopo, quindi è possibile utilizzarlo, ma leggere la voce Libri in linea per assicurarsi che faccia ciò che si desidera.

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

+0

Non mi piace molto la soluzione varchar, ma proverò sicuramente a sql_variant e testerò il risultato delle prestazioni di conversione. Se è accettabile, allora quello sarà il modo in cui è! Grazie per il tuo suggerimento. –

+0

+1: è bello imparare roba – Brad

+3

+1 per sql_variant. Per prima cosa ne ho sentito parlare! –

0

Memorizzarlo come varchar (o nvarchar). Questo gestirà tutti i tipi. Dovrai determinare la durata per farlo in base a ciò che sai sui tuoi dati.

+0

Grazie per il suggerimento. ma stavo evitando la soluzione varchar (nvarchar) a causa della crescita del database e delle prestazioni delle conversioni. –

+2

Non puoi avere la tua torta e mangiarla anche tu; se vuoi memorizzare diversi tipi nella stessa colonna, quale altro *** tipo useresti? String/varchar è il ** solo ** tipo che può rappresentare tutti gli altri tipi (eccetto il binario o il corso). – Brad

+0

** Nota: ho appena letto il tipo 'sql_varient' e sembra una soluzione valida, ma mi chiedo come reagirà .NET alla trasmissione degli oggetti in quella colonna al tipo che desideri. – Brad

1

come la vedo io, hai solo due opzioni:

Non Sei oggetto dovrà essere salvato come una sorta di stringa. Quella stringa potrebbe essere una stringa grezza o XML. Se lo si "serializza" come XML e lo si memorizza nel database, di nuovo, è possibile scegliere nvarchar o XML. Vorrei sottolineare che "serializzarlo" gonfierà i dati. Se riesci a determinare ragionevolmente il tipo di dati in base a un'altra colonna che potresti estrarre contemporaneamente, ti suggerisco di inserirlo semplicemente come stringa.

+1

La soluzione sembra soddisfacente, ma la stringa serializzata o l'Xml non sarebbero molto più grandi (in byte) dei dati di base stessi? –

+0

@Guilherme, sì, ed è per questo che ho detto "Vorrei sottolineare che" serializzarlo "gonfierà i dati". Ma se non hai altro modo di determinare il tipo di dati effettivo, questo può essere un fallimento. – Brad

0

provare questo:

YourTableName 
...more columns... 
ColType char(1)  --B=bit, S=smallint, I=int, R=real, n=nvarchar, you can FK to a table to store these or just check constraint them 
Col  nvarchar(x) --where x is large enought to hold your longest string or other value 
...more columns... 

in app Net, letto in ColType e convertire la colonna Col a quel tipo. Al momento del salvataggio, SQL Server convertirà i tipi di dati nativi in ​​nvarchar() per te.

+0

Grazie per il suggerimento. ma stavo evitando la soluzione varchar (nvarchar) a causa della crescita del database e delle prestazioni delle conversioni. –

+0

ha, la risposta selezionata: "sql_variant" come pensi che funzionerà meglio? –

1

io non sono sicuro di cosa si intende per 'tipo sconosciuto'. Se intendi che un valore è esattamente uno di un numero limitato di possibili tipi, allora utilizzerei una tabella a singola colonna, tipicamente forte, per ogni tipo possibile e una tabella 'superclasse' per indicare quale tabella deve cercare.

+0

In effetti è proprio la mia attuale soluzione. Ma stavo cercando di migliorare i passaggi a tabella e selezionare le query, disponendo di una singola tabella "valori". Se non c'è altra scelta, è così che rimarrà. –

Problemi correlati