Supposons que vous concevez une application qui, par nécessité, offre à l'utilisateur la possibilité de créer des types personnalisés (pour gérer ses données, quelles qu'elles soient). Une façon de gérer cela est de définir un schéma qui nous permet d'utiliser des métadonnées pour définir ces types. Cela signifie souvent que le schéma db résultant aura un moyen de stocker des paires clé/valeur (les propriétés appartenant à une instance d'un type), où la partie valeur est généralement stockée sous forme de chaîne (quel que soit le type de données sous-jacent de la colonne). Cela seul présente un certain nombre de problèmes. J'ai lu que somefrown upon en utilisant un db pour suivre les paires clé/valeur.Quelle est une bonne approche pour permettre aux utilisateurs de définir leurs propres types personnalisés?
Le principal problème que j'ai avec elle est de savoir comment cela affecte les requêtes. Par exemple, supposons que l'utilisateur souhaite créer un type appelé Event
ayant ces colonnes: event_name
, description
, start_at
et end_at
(datetimes). L'utilisation de paires clé/valeur où toutes les valeurs sont des chaînes rend les requêtes plus sensibles à la façon dont les valeurs des paramètres sont formatées; par conséquent, l'interrogation d'un ensemble d'événements compris entre deux dates n'est pas aussi simple que si nous utilisions des colonnes datetime réelles. Cela m'incite à envisager d'autres conceptions qui pourraient accommoder des types personnalisés. Le premier qui m'est venu à l'esprit et qui m'a le plus plu était d'utiliser la base de données elle-même pour définir ces types personnalisés. C'est-à-dire, plutôt que de créer un ensemble séparé de méta-tables dans lesquelles tous les types doivent être définis, laissez simplement à l'utilisateur un privilège limité de créer/modifier ses propres tables dans la base de données (par exemple: usertable-johndoe-album
). Le problème le plus important que je vois avec cette approche est le grand nombre de tables qui pourraient éventuellement exister. Je me demande si la plupart des bases de données open-source (MySQL, PostgreSQL, etc.) ont une limite stricte ou pratique sur le nombre de tables qu'elles peuvent gérer sans être entravées. Autrement dit, je sais que la plupart des bases de données prêtes pour la production sont réglées pour gérer des millions d'enregistrements, mais je ne sais pas si elles sont équipées pour gérer des centaines de milliers de tables. Est-ce que quelqu'un sait?
Étant donné la nécessité de permettre aux utilisateurs de créer leurs propres types, préférez-vous les paires clé/valeur ou l'utilisation de la base de données elle-même? Ou si vous avez un autre modèle/idée, s'il vous plaît décrire.
Dans certains cas, il est logique que les utilisateurs définissent des types via des métadonnées. Ils sont généralement un peu plus d'un ensemble défini de champs de texte nommés, et ils sont créés via une interface utilisateur (généralement) conviviale. Souvent, ils sont utilisés pour une règle commerciale très spécifique dont personne ne rêvait au moment de la conception du système, et ils ne peuvent être utilisés que pendant quelques mois.Pour ces situations, il est beaucoup plus logique que le système soit suffisamment flexible pour gérer un tel type plutôt que de demander à un programmeur de créer et de compiler quelque chose. – FrustratedWithFormsDesigner
Supposons une application Web qui permet aux utilisateurs de gérer leurs propres données, un PIM de toutes sortes. (Ce ne serait pas la première application de ce genre.) Un utilisateur veut suivre les livres qu'il a lu ou qu'il veut lire. Un autre veut suivre ses contacts; Il peut même avoir des faits particuliers dont il ne se soucie pas dans la plupart des carnets d'adresses en ligne. La liste continue. Beaucoup d'utilisateurs, bien qu'ils ne puissent pas utiliser notre jargon, je pense, peuvent gérer le concept de suivi des attributs pour un type. Ce n'est guère plus que de créer une feuille de calcul avec des noms de colonne, ce que font beaucoup de gens. – Mario
L'ajout de quelques colonnes n'est même pas dans le même domaine que celui permettant la définition de types personnalisés. Pour cette paire clé/valeur, vous avez tout ce dont vous avez besoin, et très, très simplement. Le "coût" de ceci est microscopique. Aussi, s'il vous plaît mettre à jour la question vague avec ces détails. –