Domanda

Sto costruendo un sistema di database e di avere problemi con la progettazione di una delle mie tabelle.

In questo sistema v'è una tabella utenti, una tabella di oggetti, una tabella di voce e tavolo di costo.

Un record unico nella tabella dei costi è determinare da parte dell'utente, oggetto, elemento e anno. Tuttavia, non ci può essere più record che hanno lo stesso anno, se l'articolo è diverso.

La gerarchia va dall'utente> object> item-> anno, più anni unici al prodotto, più elementi unici per oggetto, più oggetti unici per utente, più utenti unici.

Quale sarebbe il modo migliore per progettare il tavolo costo?

Sto pensando di inserire l'ID utente, IDOggetto e Itemid come chiavi esterne e quindi utilizzando una chiave composito costituito da userid, objecid, ItemID e costyear. Ho sentito dire che le chiavi composte sono cattiva progettazione, ma non sono sicuro come strutturare questo per allontanarsi da utilizzando una chiave composita. Come si può dire il mio database abilità di costruzione sono un po 'arrugginito.

Grazie!

P.S. Se è importante, questo è un db InterBase.

È stato utile?

Soluzione

Per evitare la chiave composita, basta definire una chiave surrogata. Questo vale un valore artificiale, per esempio un contatore automatico.

È ancora possibile (e necessario) definire un vincolo univoco su queste colonne.

A proposito: la sua non è solo raccomandato di non utilizzare chiavi composte, è anche consigliabile usare chiavi surrogate. In tutte le tabelle.

Altri suggerimenti

Utilizzare un campo chiave generato internamente (chiamato chiavi surrogate), qualcosa di simile CostID, che gli utenti non vedranno mai, ma sarà identificare in modo univoco ogni voce nella tabella dei costi (in SqlServer, campi come uniqueidentifier o identità sarebbe fare il trucco.)

Provare a costruire il database con una chiave composta usando esattamente le colonne che si delineate, e vedere cosa succede. Si può essere piacevolmente sorpreso. Fare in modo che non vi sono dati mancanti in quelle quattro colonne, e fare in modo che non ci sono due righe hanno lo stesso valore in tutte e quattro le colonne contribuirà a proteggere l'integrità dei dati.

Quando si dichiara una chiave primaria composta, l'ordine delle colonne nella vostra dichiarazione di non influenzerà le conseguenze logiche della dclaration. Tuttavia l'indice composito che il DBMS costruisce per voi avrà anche le colonne nello stesso ordine, e l'ordine delle colonne in un indice composito fa influire sulle prestazioni.

Per le query che specificano solo uno, due, o tre di queste colonne, l'indice sarà inutile se la prima colonna nell'indice è una colonna non specificato nella query. Se si conosce in anticipo come le vostre domande sono gonig a me, e che interroga più bisogno di correre veloce, questo può aiutare a dichiarare le colonne per la chiave primaria nel giusto ordine. In rare circostanze la creazione di due o tre altri indici di una colonna può accelerare alcune query, a costo di rallentare gli aggiornamenti.

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