2009-03-25 6 views
0

Disons que je les 2 tableaux suivants dans une base de données:Comment séparer correctement les tables remplies automatiquement des tables remplies manuellement dans SQL Server?

[Movies] (Scheme: Automatic) 
---------------------------- 
MovieID 
Name 

[Comments] (Scheme: Manual) 
---------------------------- 
CommentID 
MovieID 
Text 

La table « Films » est mis à jour par un service toutes les 10 minutes et la table « Commentaires » est mise à jour manuellement par les utilisateurs de la base de données.

Normalement, vous créez simplement une simple relation de clé étrangère entre les deux tables avec des mises à jour en cascade et des suppressions, mais dans ce cas je veux pouvoir conserver les données saisies manuellement même si le film auquel elle fait référence est supprimé (le service de mise à jour n'est pas si fiable). Cela ne devrait poser problème que dans les relations un-à-plusieurs d'une table automatique à une table manuelle. Comment sépareriez-vous le manuel et les parties automatiquement remplies de la base de données?

Je comptais d'ajouter une clé étrangère qui ne maintient pas l'intégrité et referencial que les mises à jour des cascades, pas des suppressions. Mais y a-t-il des pièges dont je devrais être conscient en le faisant de cette façon? Je veux dire, sauf le fait que je pourrais finir avec certaines des données manuelles qui ne font référence à rien.

Modifier/Précision:

Juste pour clarifier. Les tables d'exemples sont entièrement composées. En réalité, la base de données contiendra des objets tels que des serveurs, des applications, des notes d'application, des numéros de versions, etc. Les informations relatives au serveur seront automatiquement renseignées, mais certains détails de l'application seront renseignés manuellement. Ce pourrait être des informations comme des configurations spéciales et autres. Même si l'enregistrement du serveur est supprimé, les notes d'application sur ce serveur sont toujours valables et ne doivent pas être supprimées.

Répondre

3

Je vous suggère d'utiliser une table d'importation qui est mise à jour par le service, puis alimenter les tables de films de cela. Ensuite, vous pouvez conserver les films qui sont supprimés dans la table des films. Possibilité de les marquer comme supprimés ou obsolètes, mais vous pourriez toujours les conserver à des fins historiques.

+0

Je pense que vous avez raison, il est probablement préférable de marquer supprimé comme tel au lieu de les supprimer réellement. Cela rendra également la logique dans mes entités commerciales plus simple et plus facile à générer automatiquement. Merci. – JohannesH

1

Je pense que vous devriez utiliser une suppression logicielle pour ce scénario. Je ne pense pas que tu veuilles avoir des commentaires tu ne sais pas à quel film ils appartiennent.

+0

J'ai ajouté une précision à la question, les tableaux ne sont pas réellement des "films" et des "commentaires". J'aurais dû le mentionner dans la question initiale, désolé. – JohannesH

1

D'accord; un exemple de route serait de copier la table des films et d'ajouter un champ d'état qui indique l'état actuel de chaque enregistrement (live/checking/deleted). Ensuite, l'autoimport devrait aller dans une table temporaire, régler l'état de tous les films sur 'checking', puis utiliser la table temporaire pour mettre à jour la table des vrais films, définissant l'état du film à vivre quand il est trouvé dans la table temporaire. Une fois terminé, définissez n'importe quel film qui a encore le statut de 'vérification' sur supprimé, car il n'a pas été trouvé dans l'import automatique. À la fin de l'application, sélectionnez un film qui n'a pas de statut = supprimé.

+0

Merci pour la suggestion. (+1) – JohannesH

1

« Je comptais d'ajouter une clé étrangère qui ne maintient pas l'intégrité referencial et que les mises à jour des cascades, des suppressions pas. »

Étant donné que vous semblez utiliser des clés de substitution, les mises à jour ne seront pas pertinentes pour les éléments étrangers. De plus, puisque vous ne vous souciez pas des données orphelines, alors pourquoi utiliser la contrainte référentielle? Vous utilisez des contraintes pour vous assurer que quelque chose existe, ce que vous ne semblez pas exiger dans cette situation.

+0

Vous avez probablement raison sur les mises à jour. La raison d'inclure toujours le fk est que je les utilise pour générer automatiquement des entités commerciales. Mais je ne pense pas réellement qu'il se comportera correctement quand les données sont manquantes. Je vais probablement ajouter une colonne "supprimée" comme les autres réponses suggèrent. – JohannesH

Questions connexes