2

Développeurs et concepteurs de bases de données, salut!Problèmes avec la conception du schéma de base de données

Je conçois un schéma de base de données pour mon projet.

Le projet concerne les relations entre les «producteurs» et les «consommateurs». Mais si un «Producteur» peut être à la fois un «Utilisateur» et une «Organisation», alors un «Consommateur» peut être seulement un «Utilisateur» (même si ce n'est que maintenant). Si l'on considère le modèle objet de mon projet, il se compose principalement de deux interfaces de base - «Producteurs» et «Consommateurs». Les relations seront entre les instances des classes principales qui sont 'Organization' et 'User', ce qui est plus la classe 'Organization' implémente l'interface 'Producer' et la classe 'User' implémente les interfaces de 'Producer' et 'Sonsumer'. Par exemple, pour une certaine période d'utilisation de mon application, certains utilisateurs doivent être en mesure de vendre des articles à d'autres utilisateurs, et être en mesure d'acheter des produits de n'importe qui.

enter image description here

À l'avenir, je prévois d'intégrer les systèmes de paiement les plus demandés au projet. Dites-moi s'il vous plaît si vous avez l'expérience de travailler avec des systèmes de paiement, comment cela va changer le modèle et le schéma de base de données. Ai-je besoin d'ajouter les entités «entité légale» et «individu»?

J'ai conçu le diagramme ER selon la description ci-dessus, mais il présente plusieurs inconvénients.

enter image description here

Tout d'abord, il n'y a pas de correspondance complète entre ER-description et la description UML. Ai-je besoin d'allouer des tables détachées pour les interfaces? Je ne sais pas. En effet, dans ce cas, selon la description ER, on peut dire que le «producteur» et le «consommateur» sont des superclasses d '«organisation» et d' «utilisateur». Mais en fait ce ne sont que des interfaces.

Deuxièmement, j'ai besoin de la conception la plus simple pour fournir l'accès à l'espace de stockage suffisamment flexible, sans 'JOIN' inutile. Peut-être que je devrais abandonner complètement les implémentations d'interfaces? Mais je suis tout pour utiliser la richesse de POO. Est-il possible d'utiliser des implémentations d'interfaces au niveau de la base de données? Je sais que l'héritage peut être utilisé. Mais je ne sais pas comment ces astuces vont affecter la productivité - à cause de tous les projets précédents ne nécessitaient pas l'utilisation des superclasses et des interfaces. J'utiliserai PostgreSQL comme SGBD relationnel.

Veuillez partager votre expérience et les implémentations de schémas de base de données réussies.

MISE À JOUR

Si j'attribuer des rôles pour les tables de producteur »et « consommateur », alors je vais devoir leur donner des attributs caractérisant l'utilisateur de« entités et « Organisation ». D'une part, si le nombre de rôles augmente, alors le nombre d'attributs augmente. Ce chemin entraîne la congestion des attributs des tables. Et certains attributs pour différents rôles seront conformes aux valeurs NULL. D'un autre côté, un attribut pour un rôle peut se conformer à plusieurs attributs pour un autre rôle. Par exemple, l'attribut 'nom' d'une entité 'Organisation' est conforme aux attributs 'prénom', 'middlename', 'nom' et 'nom d'utilisateur' pour une entité 'Utilisateur'. Troisièmement, je veux toujours séparer les modèles «Producteur», «Organisation», «Utilisateur» et «Consommateur» les uns des autres.

enter image description here

+1

Ce que je pense que vous luttez avec est le sujet des «rôles». C'est un problème très commun. Une personne peut jouer plusieurs rôles. Cela ne fait pas d'une personne une sorte de rôle parce que cela signifie que cela doit toujours être le cas. Vous pouvez trouver que la création d'une relation de jeu de rôle peut résoudre le problème, mais je n'ai pas eu le temps d'analyser votre problème avec attention. Vous pouvez également constater que les entités qua (par exemple, une personne en tant que producteur) sont utiles pour conserver l'historique et d'autres faits. –

+0

Tricky, en effet. Ce que Jim dit est juste. Je pourrais examiner cela plus tard dans la soirée (à moins que Jim ne fournisse une bonne réponse). –

+1

Je pense que vous posez trop de questions à la fois, en fait. Je compte quatre questions explicites et plusieurs autres questions implicites. Tout provient d'un modèle inexact de ce qui existe dans le domaine du problème. Je vous suggère de régler ce problème. L'UML et l'ER peuvent alors facilement s'aligner avec cela. En fait, un modèle UML peut constituer la base de votre POO et de votre base de données. –

Répondre

1

Il y a probablement beaucoup de moyens et aucune est un optimum. En tant qu'architecte, vous devez donc peser les avantages et les inconvénients d'une architecture. Je commencerais probablement par construire une abstraction de base de données.Ici, cela dépend de combien vous aurez besoin de la persistance de vos objets. C'est-à-dire, ai-je besoin de la persistance instantanée ou serait-il assez bon d'avoir une ombre qui peut fonctionner en arrière-plan.

enter image description here

Donc, fondamentalement, vous avez des tables qui dépendent des classes correspondantes. Vous pourriez simplement laisser ouvert comment cette dépendance est réalisée. Certains langages de programmation fournissent des échafaudages pour cartographier l'un contre l'autre. C'est pratique et économise beaucoup de dactylographie/conception. Bien sûr, ce n'est pas très flexible. Donc, sur cette base, vous devriez envisager différentes options. Serait-il nécessaire d'implémenter l'accès à la base de données dans les classes et de leur faire réaliser une interface sérialiseur?

enter image description here

Cela offrirait certainement beaucoup d'options de peaufinage et de performance. Mais vous aurez probablement aussi des frais généraux de mise en œuvre.

Ou serait-il préférable d'avoir un mécanisme d'ombrage où vous pouvez vous abonner pour que votre état soit enregistré simultanément?

enter image description here

Ainsi, afin d'obtenir la décision de bonne conception, vous devez penser à la façon dont les objets et la base de données sont reliés les uns aux autres et la force de ces besoins se liant à être. Malheureusement, il n'y a pas de solution miracle.