2008-08-08 22 views
8

Esiste un modo per utilizzare l'ereditarietà nel database (in particolare in SQL Server 2005)?Ereditarietà nel database?

Supponiamo che io ho pochi campo come createdOn, CreatedBy che voglio aggiungere su tutti i miei soggetti. Sto cercando un modo alternativo invece di aggiungere questi campi ad ogni tabella.

+0

Penso che la tua domanda sia formulata in modo più appropriato come "Quali sono alcuni metodi consigliati per gestire il controllo in un database?" –

+0

Se questo è l'unico scopo, sono d'accordo. Ma la domanda db-iheritance è buona –

+0

Realted: http://stackoverflow.com/questions/386652/techniques-for-database-etherity – jpalecek

risposta

3

Non esiste l'ereditarietà tra le tabelle in SQL Server 2005 e, come notato dagli altri, è possibile ottenere fino all'aiuto aggiungendo le colonne necessarie alle tabelle quando vengono create, ma non lo sarà sii ereditario come tu lo sai.

Pensa più ad un modello per i tuoi file di codice sorgente.

Come indicato da GateKiller, è possibile creare una tabella contenente i dati condivisi e farvi riferimento con una chiave esterna, ma è necessario disporre di agganci di controllo, trigger o eseguire manualmente l'aggiornamento.

Bottom line: lavoro manuale.

+0

prova a non fare riferimento a un altro post perché vengono messi fuori servizio a causa del voto. –

1

si potrebbe creare un modello nel riquadro del modello in Management Studio. E poi usa quel modello ogni volta che vuoi creare una nuova tabella.

In mancanza di questo, è possibile memorizzare i campi createdOn e CreatedBy in una tabella Pista di controllo fanno riferimento alla tabella originale e id.

In caso contrario, farlo manualmente.

+0

i modelli non sono ereditarietà –

3

PostgreSQL ha questa caratteristica. Basta aggiungere questo alla fine della vostra definizione di tabella:

INHERITS FROM (tablename[, othertable...]) 

La tabella bambino avrà tutte le colonne della sua controllante, e le modifiche alla tabella padre cambierà il bambino. Inoltre, tutto nella tabella figlio verrà visualizzato nelle query sulla tabella padre (per impostazione predefinita). Sfortunatamente gli indici non attraversano il confine genitore/figlio, il che significa anche che non è possibile assicurarsi che determinate colonne siano univoche tra padre e figlio.

Per quanto ne so, non è una funzione utilizzata molto spesso.

+0

ho pensato che la domanda dicesse 'specificatamente in SQL Server 2005' ? –

0

È possibile utilizzare uno strumento di modellazione dei dati come ER/Studio o ERWin. Entrambi gli strumenti hanno colonne di dominio in cui è possibile definire un modello di colonna che è possibile applicare a qualsiasi tabella. Quando il dominio cambia, anche le colonne associate. ER/Studio dispone anche di modelli di trigger che è possibile creare e applicare a qualsiasi tabella. In questo modo aggiorniamo le colonne LastUpdatedBy e LastUpdatedDate senza dover creare e mantenere centinaia di script di trigger.

Se si crea una tabella di controllo, si avrà una riga per ogni riga in ogni tabella che utilizza la tabella di controllo. Potrebbe essere complicato. A mio parere, è meglio mettere le colonne di controllo in ogni tabella. Si consiglia inoltre di inserire una colonna timestamp in tutte le tabelle. Non si sa mai quando la concorrenza diventa un problema. Le nostre colonne di controllo del DB che inseriamo in ogni tabella sono: CreatedDt, LastUpdatedBy, LastUpdatedDt e Timestamp.

Spero che questo aiuti.

0

Abbiamo un SProc che aggiunge colonne di controllo a una data tabella e (facoltativamente) crea una tabella di cronologia e trigger associati per tracciare le modifiche a un valore. Sfortunatamente, la politica aziendale significa che non posso condividere, ma in realtà non è difficile da raggiungere.

0

Se si utilizzano GUID, è possibile creare una tabella CreateHistory con colonne GUID, CreatedOn, CreatedBy. Per popolare la tabella, dovresti comunque creare un trigger per ogni tabella o gestirlo nella logica dell'applicazione.

+0

se tutto quello che hai è il GUID, come faresti a sapere da quale tavolo proviene? –

0

NON si desidera utilizzare l'ereditarietà per fare ciò! Quando la tabella B, C e D eredita dalla tabella A, ciò significa che la tabella di interrogazione A ti darà i record da B, C e D. Ora considera ...

ELIMINA DA a;

Invece di eredità, uso come invece ...

CREATE TABLE blah (
    blah_id  serial  PRIMARY KEY 
    , something text   NOT NULL 
    , LIKE template_table INCLUDING DEFALUTS 
); 
0

Ramesh - vorrei implementare questo utilizzando le relazioni di sottotipo supertipo e nel mio modello E-R. Ci sono alcune diverse opzioni fisiche che hai di implementare le relazioni pure.

0

a O-R mappatura, mappe di successione a una tabella padre in cui le tabelle padre e figlio utilizzano lo stesso identificatore

ad esempio

create table Object (
    Id int NOT NULL --primary key, auto-increment 
    Name varchar(32) 
) 
create table SubObject (
    Id int NOT NULL --primary key and also foreign key to Object 
    Description varchar(32) 
) 

sotto-oggetto ha una relazione di chiave esterna a Object. quando crei una riga SubObject, devi prima creare una riga Oggetto e utilizzare l'Id in entrambe le righe