2010-03-16 1 views
1

Les utilisateurs doivent pouvoir ajouter un type spécifique de colonne à une table autrement statique sur ma page Web, puis enregistrer les informations ils entrent dans la base de données.Besoin d'un bon moyen de stocker des données dans un DB à partir d'une table sur une page Web qui peut avoir N colonnes

On m'a dit qu'en réalité ils ne passeront presque jamais sur 5 colonnes mais je préférerais soutenir N. Les colonnes seront toutes du même type. Ma première pensée a été d'avoir une colonne XML avec les valeurs de toutes les colonnes ajoutées, mais j'étais curieux de savoir si quelqu'un d'autre avait trouvé une meilleure solution. Suggestions?

+0

Que font-ils spécifiquement pour ajouter des colonnes à la volée de cette façon? Généralement, cela est considéré comme une très mauvaise pratique. La conception de la base de données ne doit pas être laissée aux utilisateurs. – HLGEM

Répondre

0

Si vous sérialisez ces données dans une colonne (comme l'utilisation de xml), vous aurez des problèmes si vous avez besoin de faire une recherche dessus.

Si vous n'avez jamais besoin de chercher dessus, alors xml serait bien.

vous pouvez utiliser le modèle parent-enfant:

FixedTable 
PK 
data1 
data2 
... 

VariableTable 
PK - auto generate/identity 
fk - points to FixedTable.PK 
data1 

et ont encore la possibilité d'ajouter un index et la recherche. Vos données regualr vont dans le FixedTable, et extra columns les utilisateurs ajoutent, va dans le VariableTable.

+0

Quels types de problèmes? Performance? Je pense que vous pouvez vérifier les valeurs XML dans une clause where dans SQL Server 2008, que j'utilise. –

+0

oui en 2008, vous pouvez: http://stackoverflow.com/questions/966441/xml-query-in-sql-server-2008, vous devez éditer votre question avec la bonne balise sql-server-2008! –

+1

@Abe: @KM parle de la différence entre XML stocké en tant que valeur de chaîne sérialisée VS. XML stocké en tant que type de données XML. –

0

Vous pouvez utiliser un vertical table. Il y a quelques obstacles que vous devez franchir et vous prenez des coups de performance, mais ils sont TRÈS flexibles à cet égard. En outre, si vous utilisez SQL Server, consultez le PIVOT command.

0

Si vous devez le faire, faites-le dans une table séparée que vous pourrez joindre ultérieurement à la table d'origine. Si vous le devez, vous pouvez utiliser une structure EAV, mais sachez que la flexibilité d'ajouter n colonnes a un très grand impact sur les performances. Je parle de performances vraiment inacceptables dans de nombreux cas et plus il y a de records, plus ça devient mauvais. Ne descendez pas cette route à moins d'être sûr que vous n'avez pas d'autre choix. Anothe route est de les prendre au mot et d'ajouter une table avec cinq colonnes étiquetées col1, col2, col3 (et toutes les autres colonnes que vous devez lier à l'utilisateur et/ou autre tableau de données) et laissez-les ajouter des données à ces colonnes. Si chaque utilisateur doit les nommer quelque chose de différent, vous devrez peut-être utiliser une table de références croisées pour déterminer les noms des colonnes.

Vous pouvez mettre les données dans un champ XML, mais comment allez-vous interroger cela plus tard? Vous avez vraiment besoin de comprendre cela avant de décider d'une façon de gérer.

En général, ce niveau de flexibilité est une mauvaise idée. Cinq utilisateurs différents ajouteront chacun cinq colonnes différentes qui contiennent des données simliar que vous voudrez interroger ensemble, mais parce qu'ils ont chacun utilisé un nom différent, vous avez un désordre au lieu d'une base de données. Si vous devez avoir des colonnes conçues par le client, essayez au moins d'obtenir un administrateur par client pour faire l'ajout des colonnes, pas les utilisateurs à la volée car ils pensent à quelque chose d'agréable à avoir.

Questions connexes