THE SCENARIO
Ho appreso concetti di base di progettazione di database come operazioni di base CRUD, integrità referenziale, relazioni, ecc., anni fa. Ho fatto confusione con i database e ho usato questa conoscenza in una capacità "non ufficiale" nel corso degli anni mentre imparavo a conoscere C # e WPF.
Ora mi trovo all'inizio del mio primo progetto di progettazione di database "ufficiale". Sto per progettare e scrivere un'applicazione WPF per la mia azienda. Questa applicazione è da sostituire e un vecchio conglomerato Foxpro 2.6 / Visual Foxpro attualmente in uso.
La nuova applicazione WPF utilizzerà il modello di progettazione MVVM e un modello di repository per l'accesso ai dati al back-end del database SQL. Convertirò sette tabelle FoxPro 2.6 in un nuovo progetto di database SQL:
Clienti : ogni cliente può disporre di più dispositivi
**Equipment** - each piece of equipment can have multiple testtypes
**TestType1** - each test can have multiple years of test results
testtype1 year1 test result
testtype1 year2 test result
**TestType2**
testtype2 year1 test result
testtype2 year2 test result
**TestType3**
testtype3 year1 test result
testtype3 year2 test result
etc...
In questo momento, la tabella clienti di Foxpro ha un campo ID cliente come identificatore e il campo viene ripetuto in TUTTE le tabelle, incluse le tabelle TestType per l'apparecchiatura, insieme a un campo numero equipnumber.
TASTI PRIMARI / TASTI ESTERI
Intendo creare chiavi primarie in tutte le mie tabelle e impostare relazioni standard uno-a-molti tra le tabelle Cliente e Equipaggiamento e tra le tabelle Apparecchiatura e Tipo test.
Questo è quello che voglio fare, vero?
Devo anche memorizzare l'ID principale del cliente nelle mie tabelle TestType?
So che renderebbe SOME le query più semplici, ma è una progettazione corretta? Ho lavorato in un paio di negozi e ho visto i loro progetti di database. Per me, non sembrava che stessero impostando relazioni e rafforzando l'integrità referenziale usando SQL. Penso che stessero facendo tutto ciò nel codice C # / VB.
Devo impostare cose come cancellazioni a cascata, aggiornamenti, ecc. e basta SQL Server gestirlo?
È un incubo di manutenzione?
CAMPO ISTRUZIONATO - Dovrei o non dovrei
Inizialmente pensavo di voler incorporare e UNDELETE feature nel nuovo programma. Ma non sono sicuro di volerlo fare. Avevo un campo IsDeleted e DateDeleted per tutti i miei record di tabella e l'app WPF aggiorna il campo IsDeleted su true e immetti una data quando viene eliminato un record. Quindi, le utilità di amministrazione hanno una vera funzione SPURGO che può eliminare per data cancellata.
Sto chiedendo dei guai qui?
In quali scenari questa è una buona idea? Una cattiva idea?
METADATA - ID negozio o dati reali?
E un'ultima domanda. Quando si tratta di metadati, (ad esempio, il nome del tipo di test, il codice del risultato, ecc., Dovrei memorizzare il valore effettivo dei metadati stesso con un record di dati o un ID di metadati e collegarlo alla tabella dei metadati? come sarebbe ingombrante interrogare e diventare un incubo per la manutenzione. Ci sono dei vantaggi nel memorizzare un ID di riferimento su una tabella di metadati?
Spero di non essere troppo generoso qui. E ogni consiglio e suggerimento è veramente apprezzato.