Moteur de requête pour une source de données variables. C #

J'ai un set croissant de feuilles de calcul Excel aucune avec la même structure de données. J'ai besoin d'un mécanisme pour interroger chacune de ces feuilles de calcul (DataTables) en utilisant une seule interface. Donc, essentiellement, vous choisissez le DataTable à partir d'une list déroulante, puis effectuez votre search.

Ma première pensée était de le gérer comme ça.

  • Créez une structure générique de données dans SQL. Il s'agirait de quatre arrays. 1) Étude 2) StudyProperty 3) StudyPropertyType (une list statique des types de données) et 4) StudyData.
  • La première étape consisterait à définir une étude. Ce qui signifie que vous créez une input dans la table d'étude, pour lui donner un nom et une description. Inscrite à cela, vous créez un logging StudyProperty pour chaque champ correspondant dans la feuille de calcul Excel et select StudyPropertyType approprié.
  • Donc, si vous aviez une feuille de calcul avec deux colonnes (Nom et Date de naissance), vous obtenez un logging d'étude et deux loggings StudyProperty (Nom avec StudyPropertyType = string) et (Date de naissance avec StudyPropertyType = DateTime)
  • Une fois que l'étude a été définie, je peux importer datatables de la feuille de calcul Excel dans la table StudyData.
  • La table StudyData possède un Id et une colonne pour chaque type de données possible. Selon la définition de l'étude, datatables imscopes sont stockées dans le champ approprié dans la table d'étude en fonction de type de données. Ainsi, la date de naissance serait stockée dans le champ ValueDateTime de la table d'étude.

Donc, avec tout ce qui a été dit et fait, je peux avoir toutes les feuilles de calcul stockées dans SQL, mais maintenant, je suis perplexe sur la façon de créer un mécanisme de requête générique.

J'ai l'printing d'avoir rendu cela beaucoup plus compliqué que ce qu'il faut, et j'espère qu'il existe une meilleure façon de gérer les data structures inconnues.

SQL (et RDBMS en général) ne gèrent pas bien les data structures inconnues. En règle générale, ils violent toutes les définitions traditionnelles d'une database relationnelle.

Le schéma toujours tentant dont vous parlez avec des propriétés flexibles est appelé EAV (Entity-Atsortingbute-Value) ou database dans une database et peut être utilisé avec succès dans SQL / bases de données (lorsqu'il est utilisé avec beaucoup de soin), mais la plupart souvent, c'est simplement une recette pour le désastre. Il existe de nombreuses questions sur EAV ici sur StackOverflow.

Les cas où je l'ai utilisé avec succès ne sont pas destinés à des requêtes ad hoc, mais sont pour les parameters où je veux avoir des parameters arbitraires sur une entité et leur non-existence retombera à une valeur par défaut (et possible par défaut par défaut – vous voyez , c'est pourquoi EAV est dangereux!) Généralement, il existe un code supplémentaire dans l'application (ou les procédures stockées) qui connaît les parameters, mais la database n'est pas au courant. Cette seule phrase devrait vous donner une idée de la raison pour laquelle cette pratique n'est pas bonne (database). Quand je l'ai utilisé, il y a eu une préoccupation architecturale primordiale. L'utilisation empêche la database de pouvoir gérer ses données (en particulier un point faible, les types de données) et d'assurer des contrats d'intégrité / périmètre car il en sait très peu. Donc, en général, je l'associe aux SP / views / UDF pour donner à la database le plus de contrôle possible.

Il existe un proche parent d'EAV qui est lié à l'entreposage de données et à la performance statistique. Dans ces cas, il existe généralement plusieurs dimensions – unité commerciale, time, région géographique, division G / L, etc., puis un code de mesure et une valeur de mesure (généralement MONNAIE). Donc, pour le 1/1/2001 pour une unité d'affaires particulière, etc., vous pourriez avoir une mesure des dépenses avec le code 1 pour les dépenses, le code 2 pour les revenus, etc. Cela souffre de plusieurs des mêmes inconvénients que l'EAV et sa justification que vous pouvez append des mesures en ajoutant des lignes au lieu de changer un schéma (sur une table susceptible d'avoir des milliards de lignes). De plus, les mesures peuvent venir et passer au fil du time, et c'est une bonne représentation, elle gère bien le roulement, etc.

Je considérerais avant tout avant la mise en œuvre d'EAV – revenir à vos besoins / cas d'utilisation et voir s'il existe une alternative – même en analysant la feuille de calcul (en utilisant le model d'object Excel) et en construisant des tables dans la database pour correspondre et ensuite autoriser l'annonce Les requêtes sur ces tables individuelles pourraient être plus faciles.