2010-12-08 6 views
0

J'ai une table appelée Personnes l'une des colonnes est un champ XML appelé "propriétés". Je l'ai utilisé pour stocker des informations aléatoires sur chaque personne, ce qui permet aux gens de stocker des champs supplémentaires qui sont ajoutés dans le futur sans une refonte de la base de données. Tous les gens n'auront pas les mêmes éléments dans leur XML.SQL 2005 Afficher les données Xml

CREATE TABLE [dbo].[Person]( 
[PersonID] [bigint] IDENTITY(1,1) NOT NULL, 
[PersonType] [nvarchar](50) NULL, 
[Title] [nvarchar](5) NULL, 
[Forename] [nvarchar](60) NULL, 
[Surname] [nvarchar](60) NULL, 
[Company] [nvarchar](60) NULL, 
[Properties] [xml] NULL 
) 

Un exemple de xml est:

<PropertyList xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> 
    <Property Name="Class">Class A</Property> 
    <Property Name="CarRegistration">123456</Property> 
    <Property Name="MedicalNotes">None</Property> 
</PropertyList> 

J'ai plusieurs anciennes bases de données de frontend d'accès qui ont besoin d'accéder à ces données mon plan était de créer une vue pour chaque frontend qui formated la table pour correspondre sa disposition originale. Nous épargnant l'effort de re-développement des frontends d'accès car ils doivent être retirés à un moment donné. Cependant, dans mon nouveau design, quelques champs sont stockés dans les propriétés XML. Y at-il de toute façon que je peux créer une vue pouvant être mise à jour de la table avec une ou plusieurs colonnes de sauvegarde dans le champ xml.

Je pourrais par exemple vouloir créer une vue de la table appelée "people_students" qui ne retourne que tous les enregistrements où PersonType = "Student" et l'une des colonnes est appelée "Class" qui est actuellement stockée dans le xml.

Répondre

0

La réponse courte est non. Cependant, vous pourriez être capable de combiner quelque chose avec des tables temporaires (comme vous l'avez mentionné ci-dessus, en supposant que vous vouliez dire que les tables seront supprimées à un moment donné dans le futur) et des triggers. Vous auriez besoin d'un déclencheur sur votre colonne XML qui se déclencherait chaque fois que quelqu'un mettrait à jour cette colonne, et vous auriez besoin d'un déclencheur sur votre table non-permanente qui mettrait à jour le XML.

Malheureusement, c'est moche.

0

Que pensez-vous de cette approche?

Créer une table EAV. Remplissez la table avec du code XML protégé lorsque les données d'enregistrement associées sont fournies à l'utilisateur. Autoriser l'utilisateur à insérer, mettre à jour ou supprimer de la table EAV. Lorsque l'utilisateur quitte l'enregistrement ou appuie sur Enregistrer, créez un fichier XML à partir de la table EAV et mettez à jour la colonne XML dans la base de données. L'EAV peut être laissé ou retiré en fonction de la quantité de données et de la fréquence des mises à jour de l'utilisateur.

+0

À l'origine, j'allais pour une approche EAV, mais après quelques autres questions que j'ai postées ici, le consensus général était d'abandonner EAV et d'utiliser plutôt le document orienté. J'ai accepté car il m'a semblé plus facile à gérer/programmer sauf pour ce problème. Je pensais à des tables temporaires pour gérer les données qui sont similaires à votre proposition. Je n'ai pas vraiment le pouvoir de mettre à jour le code frontend car ils n'ont pas été développés par moi donc toutes les mises à jour devraient être au niveau de la base de données avez-vous une idée où je pourrais obtenir un exemple de code etc? Merci – Jammy

Questions connexes