L'opzione 2 è non una buona soluzione per un database relazionale. Si chiama associazioni polimorfiche (come menzionato da @Daniel Vassallo) e rompe la definizione fondamentale di una relazione.
Ad esempio, si supponga di avere un ResourceId di 1234 su due righe diverse. Questi rappresentano la stessa risorsa? Dipende se CommentTypeId è lo stesso su queste due righe. Ciò viola il concetto di tipo in una relazione. Vedi SQL and Relational Theory di C. J. Date per ulteriori dettagli.
Un altro indizio del fatto che si tratta di un disegno rotto è che non è possibile dichiarare un vincolo di chiave esterna per ResourceId, perché potrebbe puntare a una qualsiasi delle diverse tabelle.Se si tenta di applicare l'integrità referenziale tramite trigger o qualcosa del genere, ci si ritrova a riscrivere il trigger ogni volta che si aggiunge un nuovo tipo di risorsa commentabile.
avrei risolvere questo con la soluzione che @mdma brevemente indicato (ma poi ignora):
CREATE TABLE Commentable (
ResourceId INT NOT NULL IDENTITY,
ResourceType INT NOT NULL,
PRIMARY KEY (ResourceId, ResourceType)
);
CREATE TABLE Documents (
ResourceId INT NOT NULL,
ResourceType INT NOT NULL CHECK (ResourceType = 1),
FOREIGN KEY (ResourceId, ResourceType) REFERENCES Commentable
);
CREATE TABLE Projects (
ResourceId INT NOT NULL,
ResourceType INT NOT NULL CHECK (ResourceType = 2),
FOREIGN KEY (ResourceId, ResourceType) REFERENCES Commentable
);
Ora ogni tipo di risorsa ha la sua tabella, ma la chiave primaria seriale è assegnato in modo univoco da commentabile. Un dato valore di chiave primaria può essere utilizzato solo da un tipo di risorsa.
CREATE TABLE Comments (
CommentId INT IDENTITY PRIMARY KEY,
ResourceId INT NOT NULL,
ResourceType INT NOT NULL,
FOREIGN KEY (ResourceId, ResourceType) REFERENCES Commentable
);
Ora riferimento Commenti Risorse descrittive, con integrità referenziale applicata. Un determinato commento può fare riferimento solo a un tipo di risorsa. Non c'è possibilità di anomalie o ID delle risorse in conflitto.
Ho più informazioni sulle associazioni polimorfiche nella mia presentazione Practical Object-Oriented Models in SQL e sul mio libro SQL Antipatterns.
È possibile registrare un singolo commento su più di un elemento? Ad esempio un documento e un progetto o due documenti? –
Nessun commento può essere solo contro un elemento – Gazeth