Martin Fowler a documenté quelques Object-Relational Structural Patterns qui pourraient aider:
1) Single Table Inheritance: Représente une hiérarchie d'héritage des classes comme une seule table qui a des colonnes pour tous les champs des différentes classes.
par exemple. Employee
et Customer
héritent tous les deux de User
et sont tous deux stockés dans la table User, avec une colonne qui détermine le type d'utilisateur qu'un enregistrement particulier représente.
2) Class Table Inheritance: Représente une hiérarchie d'héritage de classes avec une table pour chaque classe.
par exemple. Employee
et Customer
héritent toutes deux de User
et il y a trois tables pour représenter ceci. La table Utilisateur stocke les propriétés communes à tous les utilisateurs. La table Employee a un pointeur vers la table User et stocke uniquement les propriétés pertinentes pour Employees. La même chose est vraie de la table Customer.
3) Concrete Table Inheritance: Représente une hiérarchie d'héritage de classes avec une table par classe concrète dans la hiérarchie.
par exemple. Employee
et Customer
héritent tous les deux de la classe abstraite User
et il y a deux tables pour le représenter. Une table Customer et une table Employee. Chaque table stocke des informations communes aux utilisateurs, mais stocke également des propriétés uniques.
Avez-vous deux tables - 'Users' et' Customers'? Je serais surpris. Je pense à une table 'users' avec un champ' user_type'. Et puis avoir une seule VO c'est-à-dire 'Users'. Et si 'user.isCustomer()' est vrai, c'est client. Donc, soit vous ne devriez pas utiliser deux tables ou vous ne devriez pas utiliser l'héritage. – Nishant
@Nishant: Ce n'est pas vrai du tout. Si les clients ont des données supplémentaires que les utilisateurs n'ont pas, vous allez encombrer la table utilisateur avec des colonnes non pertinentes. Il est certainement possible d'implémenter l'héritage avec deux tables. –
@Matt Je ne parle pas de faisabilité, je pensais plus sur le design. Le client est un utilisateur - et c'est une bonne idée d'avoir les deux dans la même table. Cela m'aidera à chercher et cela a plus de sens pour moi. Si vous êtes préoccupé par l'encombrement, extériorisez les données superflues. Créez une table séparée 'customer_details' et liez-la avec une clé étrangère. Dans de nombreux cas, vous pouvez convertir un utilisateur en client.Il est plus facile de simplement changer le type au lieu de copier les données entre les tables puis d'effacer celles-ci. Juste mes 2%. – Nishant