Un modo migliore per memorizzare coppie chiave-valore nel database?

4

Ho un programma C # / SQL Server che a volte ha bisogno di memorizzare i dati. I dati potrebbero essere una risposta da un servizio Web, un risultato di una query di database o un numero qualsiasi di altre cose. Non c'è modo di sapere prima che i dati vengano archiviati quanti campi potrebbe avere o quale potrebbe essere la struttura dati. Abbiamo questo tipo di tavolo doloroso che stiamo usando per questo ... quattro colonne e un sacco di righe. Un esempio dei dati potrebbe essere più semplice di una spiegazione.

InstanceID RowID PropertyName PropertyValue
1          1     Property1    Value1
1          1     Property2    Value2
1          1     Property3    Value3
1          2     Property1    Value1
1          2     Property2    Value2
1          2     Property3    Value3
2          1     OtherProp1   Value1
2          1     OtherProp2   Value2
2          2     OtherProp1   Value1
2          2     OtherProp2   Value2

Questi valori verranno quindi ritrasformati e inseriti in un oggetto dizionario, che può essere aggiornato, quindi i campi verranno reinseriti nel database. Questo può essere difficile da codificare, e richiede anche molti inserimenti che possono renderlo molto lento.

Non riesco a pensare a un modo migliore per farlo, ma sento che ce ne deve essere uno. Qualche consiglio?

    
posta SuperNES 31.01.2013 - 17:58
fonte

6 risposte

3

Se non è necessario eseguire query sui dati, è possibile archiviarli tutti in un'unica colonna in formato XML. Come

<properties>
    <property name="property1">Value1</property>
    <property name="property2">Value2</property>
</properties>

Se hai bisogno di fare domande contro le coppie di valori chiave hai un paio di opzioni. Se si sta utilizzando SQL Server, ha il supporto per le colonne xml, quindi è possibile utilizzare XPath nelle query. È anche possibile creare indici per XPath. Altri motori di database potrebbero avere anche caratteristiche simili

Potresti anche utilizzare un motore di ricerca separato come ElasticSearch che indicizzerebbe il tuo contenuto.

    
risposta data 31.01.2013 - 18:50
fonte
3

SQL non è stato progettato per questo scenario, ma lo sono stati gli archivi di documenti e valori-chiave. Hai preso in considerazione l'utilizzo di uno di questi?

Ad esempio MongoDB ha un driver C # con supporto Linq (anche se dubito che ne avrai effettivamente bisogno). Puoi semplicemente memorizzare tutti i "dati dinamici" in un documento mongodb per entità SQL.

Un'altra alternativa sarebbe redis, semplicemente mappando gli identificatori di entità univoci agli hash che contengono i corrispondenti valori-valore-dati.

    
risposta data 18.02.2013 - 14:48
fonte
0

Ho intenzione di seguire la soluzione xml. Direi anche che in LedgerSMB stiamo cercando di fare JSON che ora è supportato nativamente sotto PostgreSQL per coppie chiave / valore estese. Vorrei anche sottolineare che attualmente questo può essere fatto in SQL Server creando alcune funzioni di elaborazione TSQL. Vedi link

Tuttavia, data la complessità che utilizza componenti JSON non nativi, direi che usare XML è la cosa migliore.

    
risposta data 18.02.2013 - 09:07
fonte
0

Attualmente stai adottando l'approccio tradizionale per questo bisogno all'interno di un database relazionale.

Una modifica da considerare è costituita da colonne strongmente tipizzate per i valori, come nell'opzione 4 di questo post: link .

    
risposta data 18.02.2013 - 14:33
fonte
0

Ho un numero di applicazioni che usano / memorizzano i dati in modo simile. Non sono sicuro esattamente da dove provenga il tuo "dolore" in questo caso, in quanto di solito è un modello abbastanza semplice da seguire.

Una cosa che può aiutare è la creazione di un tipo di dati tabella personalizzato in SQL che ha campi Nome e Valore. Quindi chiamando il tuo proc memorizzato puoi semplicemente passare qualcosa come InstanceID, RowID e una tabella del tuo tipo personalizzato contenente il numero x di coppie nome-valore.

Ciò rende l'interfaccia coerente per le tue chiamate, indipendentemente da ciò che viene effettivamente passato.

Qualcos'altro da guardare potenzialmente potrebbe essere la creazione di oggetti statici in una classe per memorizzarla nella cache. Gestisci i metodi in quella classe e fornisci chiamate asincrone a SQL per tenerlo aggiornato se necessario.

    
risposta data 16.12.2015 - 17:00
fonte
0

Dovresti utilizzare un database NoSQL (NosDB - un open source .Net database ) e convertire i tuoi oggetti in JSON o potresti usare NCache e semplicemente serializzare i tuoi oggetti C # e memorizzarli così com'è.

Se hai bisogno di interrogare quei valori individuali, dovresti usare le sue capacità SQL o tag / raggruppare le tue chiavi poiché NCache è più di un semplice archivio di valori .net. Leggi qui

store = NCache.InitializeCache("somecache");
DotNetObject dotNetObject = new DotNetObject();
store.Insert("key", DotNetObject);
// ... 
dotNetObject = store.get("key"); //voila you have the object deserialized
    
risposta data 25.04.2016 - 13:29
fonte

Leggi altre domande sui tag