Domanda

Sto progettando questa raccolta di classi e classi astratte (MustInherit)...

class diagram

Questa è la tabella del database in cui memorizzerò tutto questo...

database table

Per quanto ne sa il database di Microsoft SQL Server, quelle sono tutte colonne nullable ("Consenti Nulls").

Ma in realtà, dipende dalla classe memorizzata lì:LinkNode, HtmlPageNode o CodePageNode.

Le regole potrebbero assomigliare a queste...

rules table

Come posso applicare tali regole di integrità dei dati all'interno del mio database?


AGGIORNAMENTO:Per quanto riguarda questo design a tavolo singolo...

Sto ancora cercando di concentrarmi su un'architettura finale.

Inizialmente ho iniziato con molte piccole tabelle con quasi zero campi nullalbe.
Qual è lo schema di database migliore per la mia navigazione?

E ho appreso della proprietà LINQ to SQL IsDiscriminator.
Qual è il modo migliore per gestire le relazioni uno a uno in SQL?

Ma poi ho appreso che LINQ to SQL supporta solo l'ereditarietà di una singola tabella.
Una colonna LINQ to SQL IsDiscriminator NON può ereditare?

Ora sto cercando di gestirlo con una raccolta di classi e classi astratte.
Per favore aiutami con le mie lezioni astratte su .NET.

È stato utile?

Soluzione

Utilizzare i vincoli CHECK sulla tabella.Questi consentono di utilizzare qualsiasi tipo di logica booleana (inclusi altri valori nella tabella) per consentire/rifiutare i dati.

Dal Libri in linea luogo:

È possibile creare un vincolo di controllo con qualsiasi espressione logica (booleana) che restituisce vera o falsa in base agli operatori logici.Per l'esempio precedente, l'espressione logica è:stipendio >= 15000 E stipendio <= 100000.

Altri suggerimenti

Sembra che tu stia tentando il Ereditarietà della tabella singola pattern, questo è un pattern trattato nella sezione Object-Relational Structural Patterns del libro Modelli di architettura delle applicazioni aziendali.

Consiglierei il Ereditarietà della tabella delle classi O Eredità della tabella concreta pattern se desideri applicare l'integrità dei dati tramite vincoli di tabella SQL.

Anche se non sarebbe il mio primo suggerimento, potresti comunque utilizzare l'ereditarietà della tabella singola e applicare semplicemente i vincoli tramite una procedura memorizzata.

Puoi impostarne alcuni inserire/aggiornare trigger.Basta controllare se questi campi lo sono nullo O non nullo, e, se necessario, rifiutare l'operazione di inserimento/aggiornamento.Questa è una buona soluzione se desideri archiviare tutti i dati nella stessa tabella.

Puoi anche creare un file tabella unica per ogni classe anche.

Avere una tabella univoca per ogni tipo di nodo.

Perché non semplicemente fare in modo che la classe che stai creando imponga l'integrità dei dati per il proprio tipo?


MODIFICARE

In tal caso, puoi a) utilizzare vincoli logici (vedi sotto) o b) procedure memorizzate per eseguire inserimenti/modifiche (una buona idea a prescindere) o c) ancora una volta, fai semplicemente in modo che la classe imponga l'integrità dei dati.

Un misto di C&B sarebbe il corso degli eventi che prendo.Avrei procedure memorizzate uniche per aggiunte/modifiche per ciascun tipo di nodo (ad es.Insert_Update_NodeType) e fare in modo che la classe esegua la convalida dei dati prima di salvarli.

Personalmente insisto sempre per inserire il codice di integrità dei dati sulla tabella stessa tramite un trigger o un vincolo di controllo.Il motivo è che non è possibile garantire che solo l'interfaccia utente aggiornerà l'inserimento o l'eliminazione dei record.Né si può garantire che qualcuno non possa scrivere una seconda sp per aggirare i vincoli della sp originale senza comprendere le effettive regole di integrità dei dati o addirittura scriverla perché non è a conoscenza dell'esistenza della sp con le regole.Le tabelle sono spesso interessate da pacchetti DTS o SSIS, query dinamiche dall'interfaccia utente o tramite l'analizzatore di query o la finestra di query o anche da processi pianificati che eseguono codice.Se non inserisci il codice di integrità dei dati a livello di tabella, prima o poi i tuoi dati non avranno integrità.

Probabilmente non è la risposta che vuoi sentire, ma il modo migliore per evitare incongruenze logiche, che vuoi davvero guardare normalizzazione del database

Quello di Stefano la risposta è la migliore. Ma se DEVI, puoi aggiungere un vincolo di controllo alla colonna HtmlOrCode e alle altre colonne che devono essere modificate.

Non ho molta familiarità con SQL Server, ma so che con Oracle puoi specificare vincoli che potresti utilizzare per fare ciò che stai cercando.Sono abbastanza sicuro che puoi anche definire vincoli nel server SQL.

MODIFICARE:ho trovato questo collegamento sembra contenere molte informazioni, un po' lunghe ma potrebbe valere la pena leggerle.

Applicare l'integrità dei dati nei database in pratica, esistono quattro tipi principali di integrità dei dati:entità, dominio, referenziale e definito dall'utente.

L'integrità dell'entità si applica a livello di riga;l'integrità del dominio si applica a livello di colonna e l'integrità referenziale si applica a livello di tabella.

  1. L'integrità dell'entità garantisce che una tabella non contenga righe duplicate e sia identificata in modo univoco.

  2. L'integrità del dominio richiede che un insieme di valori di dati rientri in un intervallo specifico (dominio) per essere valido.In altre parole, l'integrità del dominio definisce le voci consentite per una determinata colonna limitando il tipo di dati, il formato o l'intervallo di valori possibili.

  3. L'integrità referenziale si occupa di mantenere sincronizzate le relazioni tra le tabelle.

@Zack:Puoi anche consultare questo blog per leggere ulteriori dettagli sull'applicazione dell'integrità dei dati, qui- https://www.bugraptors.com/what-is-data-integrity/

SQL Server non sa nulla delle tue classi.Penso che dovrai imporlo utilizzando una classe Factory che costruisce/decostruisce tutti questi per te e si assicura che tu stia passando i valori giusti a seconda del tipo.

Tecnicamente questo non significa "applicare le regole nel database" ma non penso che ciò possa essere fatto in un'unica tabella.I campi accettano valori null oppure no.

Un'altra idea potrebbe essere quella di esplorare le funzioni SQL e le procedure memorizzate che fanno la stessa cosa.Ma non è possibile imporre che un campo sia NOT NULL per un record e NULL per quello successivo.Questo è il tuo lavoro di livello aziendale/fabbrica.

Hai provato Hibernate?È un prodotto molto più maturo di Entity Framework.È gratis.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top