Cette question porte sur la façon de concevoir une base de données, il peut s'agir de bases de données relationnelles / nosql, en fonction de la meilleure solution
Étant donné une exigence où vous devrez créer un système qui impliquera une base de données pour suivre "Société" et "Utilisateur". Un seul utilisateur appartiennent toujours à un seul société
- Un utilisateur peut appartenir à une société
- Une entreprise peut avoir plusieurs utilisateurs
La conception de la table "Entreprise" est assez simple. La société aura les attributs / colonnes suivants: (restons simples)
ID, COMPANY_NAME, CREATED_ON
premier scénario
Simple et direct, les utilisateurs ont tous le même attribut, donc cela peut être facilement fait dans un style relationnel, table utilisateur:
ID, COMPANY_ID, FIRST_NAME, LAST_NAME, EMAIL, CREATED_ON
deuxième scénario
Que se passe-t-il si différentes entreprises souhaitent stocker un attribut de profil différent pour leur utilisateur. Chaque entreprise aura un ensemble défini d'attributs qui s'appliqueraient à tous les utilisateurs de cette entreprise.
Par exemple:
- La société A souhaite stocker: LIKE_MOVIE (booléen), LIKE_MUSIC (booléen)
- Société B veut magasin: FAV_CUISINE (String)
- La société C veut stocker: OWN_DOG (Boolean), DOG_COUNT (int)
approche 1
la voie de la force brute est d'avoir un seul schéma pour l'utilisateur et leur laisser quand ils ne nulls appartiennent à la société:
ID, COMPANY_ID, FIRST_NAME, LAST_NAME, EMAIL, LIKE_MOVIE, LIKE_MUSIC, FAV_CUISINE, OWN_DOG, DOG_COUNT, CREATED_ON
Ce qui est un peu méchante parce que vous finirez avec beaucoup de lignes NULLS et utilisateurs qui ont des colonnes qui ne sont pas pertinents pour les (p. Tous les utilisateurs appartenant à la société A a des valeurs NULL pour FAV_CUISINE, OWN_DOG, DOG_COUNT)
approche 2
une deuxième approche, est d'avoir « champ forme libre »:
ID, COMPANY_ID, FIRST_NAME, LAST_NAME, EMAIL, CUSTOM_1, CUSTOM_2, CUSTOM_3, CREATED_ON
Ce qui serait désagréable en soi puisque vous n'avez aucune idée de ce que sont les champs personnalisés, le type de données ne reflétera pas les valeurs stockées (par exemple, nous stockons la valeur int en tant que VARCHAR).
approche 3
J'ai cherché dans le champ PostgreSQL JSON, auquel cas vous aurez:
ID, COMPANY_ID, FIRST_NAME, LAST_NAME, EMAIL, CUSTOM_PROFILE_JSON, CREATED_ON
Dans ce cas, comment pourriez-vous appliquer différents schémas à un utilisateur? Un utilisateur avec la société A aura un schéma qui ressemble à
{"LIKE_MOVIE":"boolean", "LIKE_MUSIC": "boolean"}
Alors qu'un utilisateur avec la société C aura un schéma différent:
{"OWN_DOG ":"boolean", "DOG_COUNT": "int"}
Comment dois-je résoudre ce problème?
solution relationnelle? solution NoSQL?
Edit: J'ai aussi pensé à une table « CUSTOM_PROFILE » qui l' essentiel stocker des attributs d' utilisateur dans les lignes plutôt que des colonnes.
Il y a 2 problèmes avec cette approche:
1) Les données grandissent par utilisateur croissent sous forme de lignes plutôt que de colonnes - et cela signifie pour obtenir une image complète de l'utilisateur, beaucoup de jointures doivent être effectuées, plusieurs jointures dans le tableau "profil personnalisé" sur les différents attributs personnalisés
2) La valeur des données est toujours stockée en tant que VARCHAR pour être générique, même si nous savons que les données sont censées être des nombres entiers ou booléens, etc.