Supposons que j'ai une table dans ma base de données qui se compose des colonnes suivantes, dont 3 identifient de manière unique la ligne:Quelle est la conception la plus appropriée pour un objet dont la clé de base de données est composée de plusieurs colonnes?
CREATE TABLE [dbo].[Lines]
(
[Attr1] [nvarchar](10) NOT NULL,
[Attr2] [nvarchar](10) NOT NULL,
[Attr3] [nvarchar](10) NOT NULL,
PRIMARY KEY (Attr1, Attr2, Attr3)
)
Maintenant, j'ai un objet dans mon application qui représente l'une de ces lignes. Il a trois propriétés qui correspondent aux trois colonnes Attr dans la base de données.
public class Line
{
public Line(string attr1, string attr2, string attr3)
{
this.Attr1 = attr1;
this.Attr2 = attr2;
this.Attr3 = attr3;
}
public Attr1 {get; private set;}
public Attr2 {get; private set;}
public Attr3 {get; private set;}
}
Il existe un deuxième objet dans l'application qui stocke une collection de ces objets de ligne.
Voici la question: Quelle est la conception la plus appropriée pour référencer une ligne individuelle dans cette collection (du point de vue de l'appelant)? L'appelant doit-il être responsable du suivi de l'index de la ligne qu'il modifie, puis utiliser cet index pour modifier une ligne directement dans la collection? Ou ... il devrait être méthode (s) sur l'objet qui dit quelque chose à l'effet de:
public GetLine(string attr1, string attr2, string attr3)
{
// return the line from the collection
}
public UpdateLine(Line line)
{
// update the line in the collection
}
Nous allons avoir un débat sur notre équipe, parce que certains d'entre nous pensent qu'il est plus logique de référence une ligne en utilisant leur index interne dans la collection, et d'autres pensent qu'il n'y a aucune raison d'avoir à introduire une autre clé interne lorsque nous pouvons déjà identifier de façon unique une ligne basée sur les trois attributs.
Pensées?
Je voudrais aller avec .... "changer la base de données pour ne pas avoir une clé primaire composite" si j'avais l'option et cela avait du sens. –
@Fredy - Je suis avec vous à 100%. La maintenance sur des tables avec des clés étrangères groupées m'a appris que ça ne valait pas l'élégance supposée. Surtout si l'un de ces champs a des valeurs spécifiées par l'utilisateur. – overslacked
Intéressant, donc vous les gars recommanderiez peut-être juste une clé entière auto-incrémentante? –