2009-04-14 10 views
-1

J'ai une application d'enquête par SMS qui prend dans un domaine de l'enquête, et une réponse.Quelle est la meilleure façon de gérer cette contrainte dans SQL Server 2005?

J'ai reçu des demandes de DDL détaillées, donc .... La base de données ressemble this

SurveyAnswer.Answer doit être unique dans tous les actifs enquêtes pour que SurveyDomain. En termes SQL, cela devrait toujours revenir 0..1 lignes:

select * from survey s, surveyanswer sa 
where s.surveyid = sa.surveyid and 
     s.active = 1 and 
     s.surveydomainid = @surveydomainid 
     sa.answer = @answer 

Je prévois de gérer cette contrainte au niveau de l'application, mais serait également comme une intégrité de base de données à exécuter. Quelle est la meilleure façon de procéder? Déclencheur? Possible dans une contrainte?

+0

Pouvez-vous fournir le DDL? Quelles sont vos clés primaires? –

+0

J'ai ajouté le DDL de la manière la plus simple possible ... :) – TheSoftwareJedi

Répondre

2

Comme vous couvrez 2 tables il est AFAIK seulement 2 façons d'appliquer ceci.

  1. Déclenchez comme vous l'avez suggéré.
  2. Vue indexée avec une contrainte unique sur les 3 colonnes.

En ce qui concerne la fiabilité, je voudrais aller à la vue indexée, mais le seul inconvénient est qu'il sera difficile à comprendre par des tiers.

0

En supposant que vous utilisez des procédures stockées pour effectuer des opérations LMD, vous pouvez ajouter une clause de garde au SP qui ajoute des réponses aux enquêtes pour vérifier l'existence d'une réponse équivalente. Vous pouvez alors soit lancer une exception, soit renvoyer un code d'état pour indiquer que la réponse n'a pas pu être ajoutée.

1

Il est possible d'ajouter une contrainte qui est mis en œuvre dans une UDF comme celui-ci:

alter table MyTable add constraint complexConstraint 
check (dbo.complexConstraintFct()=0) 

Où complexConstraintFct serait une fonction contenant une requête sur d'autres tables. Toutefois, cette approche présente certains problèmes, car les contraintes de vérification ont été conçues pour être évaluées sur une seule ligne à la fois, mais les mises à jour peuvent affecter plus d'une ligne à la fois. Donc, la ligne de fond est: avec les déclencheurs.

0

Vous ne pouvez pas le faire au niveau de la ligne (par exemple contrainte CHECK) de sorte que vous devez avoir quelque chose qui peut voir toutes les lignes

Un déclencheur peut envoyer des messages « nice », mais ils courent après la DML . Vous avez un bon contrôle sur le traitement.

Une vue indexée empêche l'instruction DML, mais elle génère un message d'erreur technique. C'est un objet supplémentaire et les index à maintenir.

-1

Je pense que ce que vous dites est que pour toute question active, le tuple (surveyDomain, surveyQuestion, surveyAnswer) doit être unique? En d'autres termes, l'enquête: surveyanswer est 1: 1 si l'enquête est active, même si l'enquête: surveyanswer est établie à 1: plusieurs.

Si oui, la réponse est de changer la structure de votre table. L'ajout d'une colonne activeAnswerId Nullable à l'enquête rendra effectivement la relation 1: 1; votre contrainte existante SurveyId (ou SurveyId unique, SurvetDomainId) suffira à renforcer l'unicité.

En effet, à moins que je ne sois mal compris, je suis surpris que Survey ait une colonne Question; Je m'attendrais à ce que Survey: Question soit 1: beaucoup (un sondage a beaucoup de questions) ou même beaucoup: beaucoup, si une question peut apparaître sur plus d'un sondage. Plus généralement, je pense que la raison pour laquelle il est difficile de déterminer comment appliquer la contrainte et nécessite des déclencheurs "héroïques" ou des fonctions définies par l'utilisateur, est un symptôme d'un schéma qui ne modélise pas correctement votre domaine de problème.

commentaires OP:

non, vous rater. Enquête: La réponse est 1: n. « Question » est la question de l'enquête - Tuple serait (SurveyDomain.SurveyDomainId, Survey.Answer)

Vous voulez dire que pour chaque domaine, il y a au plus une réponse? Encore une fois, en regardant votre schéma, c'est au mieux trompeur. Un SurveyDomain a de nombreuses enquêtes (dont chacune a une colonne Question) et un sondage a de nombreuses réponses? (Schema)

Mais si le bit actif de l'enquête est défini, il ne devrait y avoir qu'une seule réponse?

Est-ce qu'un sondage a été trompé?

On ne sait vraiment pas ce que vous essayez de modéliser.

Encore une fois, s'il est difficile d'ajouter une contrainte, cela suggère que votre modèle ne fonctionne pas.

+0

non, il vous manque. Enquête: La réponse est 1: n. "Question" est la question d'enquête – TheSoftwareJedi

+0

Tuple serait (SurveyDomain.SurveyDomainId, Survey.Answer) – TheSoftwareJedi

+0

Ignorer la colonne "Question" si cela aide. La colonne Question est simplement le texte de "question" pour l'enquête! Une enquête a N réponses! – TheSoftwareJedi

Questions connexes