2009-09-01 7 views
4

Étant donné que les utilisateurs doivent être en mesure de définir leurs propres champs sur un objet, et définir les valeurs autorisées pour ces champs - à la volée (pas de compilation) - comment résoudre ce problème sans utiliser EAV?EAV Alternative aux champs définis par l'utilisateur?

Exemple: Tous les objets nécessitent une ou plusieurs références au numéro de statut (1.a ou 2.b ou 3.c autorisé).

Répondre

7

Les bases de données relationnelles dépendent réellement de la présence d'un schéma prédéfini et stable. Peut-être que vous devriez regarder à document-oriented databases à la place. Ils permettent généralement la libre définition des attributs, par document, et à la volée. En ce qui concerne la validation du schéma, cela doit probablement être fait dans votre application si le schéma lui-même peut être modifié par l'utilisateur.

2

Si vous devez utiliser une base de données relationnelle, il existe une solution de contournement (maladroite). Je recommanderais aussi EAV (si vous le pouvez) ou la suggestion de Thilo. Voici la manière relationnelle de le faire.

Soyez prévenu. Voici les limites de cette approche:

  1. Nous partons du principe d'une limite maximale sur le nombre de colonnes d'un utilisateur peut créer pour chaque type de données.
  2. Nous aurons des tables rares si de nombreux utilisateurs utilisent seulement quelques-unes des colonnes
  3. Nous avons besoin de la notion d'un utilisateur qui ajoute du sens à chaque colonne
  4. Il est une violation flagrante des formes normales

_

create table main_tbl(

numColumn1 number(10), 

numColumn2 number(10), 

numColumn3 number(10), 

numColumn4 number(10), 

numColumn5 number(10), 

charColumn1 varchar2(100), 

charColumn2 varchar2(100), 

charColumn3 varchar2(100), 

charColumn4 varchar2(100), 

charColumn5 varchar2(100), 

dateColumn1 date, 

dateColumn2 date, 

dateColumn3 date, 

dateColumn4 date, 

dateColumn5 date 

) 


create table main_tblmeaning(

user_id varchar(25) foreign key references users_tbl (user_id), 

numColumn1_name varchar2(50), 

numColumn2_name varchar2(50), 

numColumn3_name varchar2(50), 

numColumn4_name varchar2(50), 

numColumn5_name varchar2(50), 

numColumn6_name varchar2(50), 

charColumn1_name varchar2(50), 

charColumn2_name varchar2(50), 

charColumn3_name varchar2(50), 

charColumn4_name varchar2(50), 

charColumn5_name varchar2(50), 

dateColumn1_name varchar2(50), 

dateColumn2_name varchar2(50), 

dateColumn3_name varchar2(50), 

dateColumn4_name varchar2(50), 

dateColumn5_name varchar2(50) 


) 

create table users_tbl(

user_id varchar2(25) primary key, 

user_name varchar2(50) 

) 

Chaque fois qu'un utilisateur souhaite une colonne de numéro que vous lui assigner une colonne de numéro gratuit (numColumn1 - 5) dans le main_tbl. Ajoutez une entrée (ligne) dans le main_tbl_meanings qui mapperait la colonne (numcolumn1-5) à un nom lisible par l'utilisateur fourni par l'utilisateur.

Questions connexes