Je travaille sur un programme dans lequel vous pouvez enregistrer des plaintes. Il existe trois types de plaintes: internal
(erreurs des employés), external
(erreurs d'une autre société) et supplier
(erreurs commises par un fournisseur). Ils contiennent des données différentes qui ne peuvent pas être partagées. J'ai actuellement 4 tables (plainte, employé, compagnie et fournisseur). Voici une visualisation des tables:Comment appliquer des sous-types dans une base de données SQL Server?
J'ai une compréhension de base des sous-types, mais je ne peux pas les traduire à partir d'une ERD dans une base de données SQL Server réelle, ou du moins dans ce scénario. Ceci est à peu près comment les 4 tables regardent (attributs non pertinents omis):
plainte
ComplaintId PK
employé
EmployeeId PK
EmployeeName
Société
COMPANYID PK
CompanyName
Fournisseur
PK SupplierID
NomFournisseur
Lors de l'enregistrement d'une plainte, l'erreur est faite par l'une des 3 types et ils ont tous autre magasin d'informations. Quel est le meilleur moyen de stocker des informations dans ce cas? J'ai pensé à mettre 2 discriminateurs dans la table de plainte: ComplaintType
et Id
afin que je puisse pointer vers quelle table vérifier et quel ID j'ai besoin, mais ce n'est pas très propre et efficace.
Veuillez nous aider.
Nous vous remercions de votre suggestion. Je vais certainement rester loin de la méthode des 2 discriminateurs. J'ai aussi essayé la méthode des 3 colonnes mais pas encore avec une sorte de contrainte. Est-il possible de forcer au moins un des champs à ne pas être nul? Si oui, comment feriez-vous cela? – Fusyion
J'ai choisi d'accepter votre réponse comme «la réponse» car elle est informative et j'ai également choisi votre première option pour faire fonctionner les choses. – Fusyion
@Mario Je ne vois pas comment une colonne ComplaintType et trois tables séparées seraient un problème. Chaque table enfant contient une clé étrangère à la table Parent. Voir ce violon: http://sqlfiddle.com/#!3/6118b6/2 Le seul problème est que l'on pourrait référencer mauvais parent, le parent de type incorect. Mais ceci peut être résolu avec l'introduction d'une contrainte supplémentaire et l'extension des clés étrangères.Voir ce violon: http://sqlfiddle.com/#!3/58cd0/1 Mais, comme SQL Server gaspille de l'espace en stockant des colonnes nulles j'irais avec une grande table ine pour tous les types et stocker des valeurs nulles dans des colonnes où cela ne s'applique pas. – Anderson