Je crée un diagramme conceptuel [oui, je sais que j'ai inclus des attributs et des clés - mais c'est juste pour moi de consolider ce que je fais tout en apprenant] - alors veuillez le traiter comme conceptuel en mettant l'accent sur les relations et tableaux et non comment schématiser;)
Mon obstacle est: j'essaie de déterminer la meilleure façon de modéliser les relations de profil, de lieu et d'organisation.
Tout d'abord, RÈGLES:
- Un ou plusieurs profils peuvent être membres / amis d'une ou plusieurs organisations ; et vice versa.
- Un ou plusieurs profils peuvent être membres / amis d'autres profils.
- Une ou plusieurs organisations peuvent être membres / amis d'autres organisations.
Ami et membre diffèrent, en ce sens que les amis sont en lecture seule et que les membres [selon le niveau] ont un accès complet pour modifier les choses.
Pour les choses compliquer encore, lieux ont leur propre ensemble de « nouvelles » règles raffinables de Une organisation possède deux emplacements , mais selon les règles emplacement, un membre [ profil ] de cette organisation peut avoir accès à un endroit, mais l' accès restreint au autre. [Désolé: vous devrez très probablement ouvrir l'image dans une autre fenêtre pour une meilleure taille d'affichage.]
Donc, comme vous pouvez le voir, le concept de profils et d'organisations est à peu près le même, ainsi que ce concept encore à modéliser d'amis et de membres [... qui, j'imagine, sera traité un peu comme les tableaux intermédiaires actuels avec le paramètre Propriétaire / Administrateur / Membre / Ami, etc. dans le dossier]. Par conséquent, pourquoi je pense au concept suivant:
Voir Option.2 dans l'image ci-dessus: qui supprimerait les tables Organization et Organization_Locations actuelles et leurs relations, en les remplaçant par la table d'organisation Option.2 en tant que relation quelque peu récursive avec Profile .
Je suppose que le nœud du problème est de savoir si je suis trop orienté programmatiquement vers le polymorphisme au détriment de la simplicité et de la flexibilité, me déroutant entièrement dans le processus;)
Merci pour vos réflexions à l'avance, très apprécié - M :).
Diagramme révisé:
En réponse aux questions de MDCCL:
- Oui, le profil est composé d'une seule personne et a la même signification - bien que là où votre raisonnement se dirige - je pense que vous avez raison: l' organisation et la personne peuvent être des sous-types de profil ; par conséquent, un profil est composé d'une personne ou d'une organisation.
- Une adresse e-mail par profil.
- Oui. Comme ci-dessus, les organisations doivent au moins avoir une adresse e-mail.
- Correct, une adresse fixe.
- C'est une possibilité, mais une rareté - bien que d'après ce que j'apprends - il faut donc modéliser un tel pour la future longévité, etc., et juste pour confirmer, un emplacement pourrait donc appartenir à plus d'une personne.
L'emplacement est définitivement l'entité intégrale entre la plupart des autres. Je vais peut-être clarifier ce qui peut être fait succinctement ici, puis vous laisser lire mes autres réponses qui, espérons-le, concerneront d'abord les ajouts bénéfiques à cette question [ puis voir ma réponse au n ° 6 à la fin ];) Re: Le propriétaire du rôle.
An **Organization** can be an Owner of zero or more **Locations**.
A Person can be an owner of zero of more Locations
[donc, comme vous l'avez supposé précédemment; Autrement dit, un profil peut être propriétaire de zéro ou plusieurs emplacements.Oui, un profil qui est un propriétaire d'un emplacement assume tous les rôles des autorisations [super - utilisateur]; un profil qui est un administrateur peut modifier certains détails de l' emplacement , mais aide / modifie principalement les détails / données fournis via tous les autres profils - cela sera principalement fourni par les «membres de base» desdits emplacement (s); ce qui laisse le membre de base , qui peut lire uniquement tous les détails relatifs à l' emplacement et fournir des données qui doivent être contrôlées par un administrateur / propriétaire . Au-delà, tout profil[Organisation / Personne] ressemble beaucoup à un membre de base "en lecture seule" - appelons-les invité - mais uniquement si l'emplacement est défini comme public [et non privé ], bien qu'ils ne puissent pas fournir d'entrée comme un membre de base peut .
- Correct.
- Votre intuition est incroyable! Oui,
it is foreseen that a single Location could contain one to many LocationTypes
- pour compliquer encore les choses - il est prévu que ces LocationTypes individuels pourraient avoir différentes autorisations pour les profils associés à l'emplacement «parent»; dont les autorisations filtreraient de l'emplacement vers le / les LocationType [un peu comme les autorisations de sécurité du dossier du système d'exploitation]. Je note via votre diagramme que vous pourriez faire référence à taper plus comme description? - Oui.
- Voir 12.
- Corriger, la possibilité pour Profil1 [personne ou organisation] pour agir sur Profile2 [personne ou organisation] appartenant lieux [si elles sont amis / membres avec des autorisations correctes] est primordiale.
- Très raisonnable - a) d' accord. b) d' accord. c) Oui, hmm? ... Peut - être qu'il devrait être la même que le profil [personne] au profil [personne] = Amis . Quelle que soit la description, elle tournerait autour de l' emplacement , car les organisations agiront sur les autres emplacements de l' organisation ; bien que sémantiquement, je doute que n'importe quelle organisation veuille paraître subalterne en tant que «membre» de l'organisation de cet emplacement pour pouvoir le faire, «peu importe la qualité de la cause».
[6]. C'est encore un peu gris pour moi, mais voilà ... À mon grand détriment, la similitude entre les relations Membre / Ami est si proche que j'ai pensé à les combiner; avec le recul de votre diagramme et de votre interprétation, il semble que vous ayez raison de les séparer [ j'allais différencier la relation unique via la propriété enum: Owner / Admin / Member / Friend ]. Votre concept, par exemple: un emplacement appartenant à une organisation aura zéro à plusieurs profils [personne ou organisation], mais il devrait y avoir une différence claire entre la façon dont les profils agissent sur l'emplacement via sa relation [membre ou ami ] désigné par les rôles.So perhaps, the default relation between any Profile is Friend [much like Guest at Answer#7], enabling them to view the read-only Location data and msg/email the Location Owner/Admin - but not allow them to receive Location updates, news, etc., as a Member would.
la source
Réponses:
C'est formidable que vous preniez le temps de comprendre, classer et modéliser les données avec lesquelles vous traitez, car, d'après mon expérience personnelle, tout cela rend le processus de développement plus facile et très flexible pour les changements futurs. Et je suis certain que vous en êtes déjà conscient.
Modèle de données préliminaire et règles métier supposées
J'ai défini une liste de règles métier que j'ai assumée après avoir lu votre question et examiné de près vos schémas, afin de décrire ma compréhension de vos spécifications. Après avoir défini une telle liste, j'ai dérivé un modèle de données IDEF1X [1] que j'ai décidé de télécharger en tant que document .PDF dans une plate-forme externe (Dropbox), car en raison de son format, ce modèle de données ne s'intègre pas bien dans une image intégrée. Ces deux instruments vont être utiles comme références pour certains points importants que j'énumère ci-dessous dans la section intitulée Aspects à résoudre afin d'avancer .
Voici d'abord le…
Puisque ce n'est que cela, préliminaire, le considérer comme un moyen de nous aider à réaliser le modèle de données final souhaité.
Règles commerciales supposées
Ce modèle de données préliminaire est dérivé d'un ensemble de règles métier (déduit de votre question) que j'énumérerai comme suit:
Organisations et profils
Notez que cela
Profile
est actuellement compris comme synonyme dePerson
.Organization
est un ami d' un à plusieursProfiles
.Organization
est un ami d' un à plusieursOrganizations
.Organization
est membre d' un à plusieursOrganizations
.Profile
est membre d' un à plusieursOrganizations
.Profile
est un ami d' un à plusieursProfiles
.Profile
est membre d' un à plusieursProfiles
.Lieux et adresses
Organization
possède un à plusieursLocations
.Location
est classé par un à plusieursLocationTypes
( un seul à un moment donné).Location
peut avoir un à plusieursAddresses
( unPhysical
, un pourShipping
, l' un pourBilling
, ou un qui sert tous ces buts, ou un qui combine deux buts et une autre qui sert seulement un d'entre eux).Un
Address
peut être conservé par un-à-plusieursProfiles
ou, autrement dit, unProfile
conserve un-à-plusieursAddresses
.Un particulier
Address
peut être utilisé par un à plusieursProfiles
(servantPhysical
pour unProfile
, utilisé pourBilling
par un autre , etc.). Ainsi, unAddress
fonctionne de manière similaire pourLocations
etProfiles
.Address
peut être, en même temps , de typePhysical
,Shipping
etBilling
.Lieux et rôles
Location
ouvre un à plusieursRoles
.Role
peut être effectué en un à plusieursLocations
.Profile
(une fois qu'il a été défini commeMember
d'unOrganization
) peut effectuer un à plusieursRoles
, en un à plusieursLocations
(mais un seul spécifiqueRole
à chacunLocation
à un moment donné, c'est-à-dire jamais deux ou plusRoles
en même temps ).Aspects à résoudre pour aller de l'avant
Afin de continuer à progresser dans la résolution de votre modèle de données, voici une liste de points pertinents qui, une fois que nous les aurons élaborés, nous aideront à atteindre cet objectif:
J'ai supposé que le terme
Profile
dans votre contexte a une signification similaire (ou la même) que celle dePerson
, mais il pourrait être un peu différent. De cette façon, diriez-vous que, dans votre scénario, les entitésOrganization
etPerson
les sous-types deProfile
?Un
Profile
(ouPerson
) peut-il posséder un à plusieursEmailAddresses
, ou unProfile
(ouPerson
) est-il fixé à exactement unEmailAddress
?Souhaitez-vous donner la possibilité à un
Organization
d'être contacté viaTelephone
etEmail
, ou souhaitez-vous restreindre cela pour qu'il ne soit possible que pour unProfile
(ouPerson
)?Je suppose que a
Location
est fixé à exactement l'unAddress
des typesPhysical
, est-ce correct?Est-il possible que a
Location
soit partagé par un à plusieurs différentsOrganizations
ou , sinon, unLocation
peut appartenir à un seulOrganization
?Vous avez déclaré via des commentaires que le fait d'être un
Member
et unFriend
est le même. Comme vous pouvez le voir dans mon modèle de données préliminaire proposé, je vous ai suivi les spécifications d'origine et décrit toutes les combinaisons possibles d'appartenance et d'amitié entreOrganization
etProfile
(ouPerson
) dans différentes entités car je pense que cela peut être utile dans l'effort de définir le meilleur possible structure pour cette partie de votre scénario. Dans ce sens:an Organization is a Member of another Organization
a des effets différents de la déclarationa Profile (or Person) is a Member of an Organization
concernant l'entité appeléeLocation
.Role
deOwner
n'est valable pour unOrganization
et, pour moi, le valideRoles
pour unProfile
(ouPerson
), à l' intérieur d' unLocation
sontAdmin
etMember
. Que pensez-vous de tout cela? Puisque vous êtes en contact direct avec les règles commerciales applicables à votre situation, vous devez me dire si mes hypothèses sont correctes.Un
Profile
(ouPerson
) peut-il jouer différentRoles
à l'intérieur d'un mêmeLocation
? c'est-à-dire, un peut-ilPerson
être en même temps leAdmin
et aussi unMember
du mêmeLocation
? Quelles sont les règles à cet égard?Je pense que le même
Profile
(ouPerson
) peut jouer différemmentRoles
dans différentsLocations
. Par exemple: UnProfile
(ouPerson
) spécifique est "Admin" dansLocation
"1", et ce mêmeProfile
(ouPerson
) est un "Member
" dansLocation
"2", en même temps. Ai-je raison?Est-il possible pour un particulier
Location
d'avoir différentsLocationTypes
en même temps, ou un individu est-ilLocation
fixé pour en tenir exactement unLocationType
?L'attribut
Organization.Website
représente- t-il l' adresse du site Web d'une organisation particulière, telle que «dba.stackexchange.com»?Si
Profile
«1» (compris commePerson
) est unMember
(ouFriend
) deProfile
«2», est-il possible pourProfile
«1» d'effectuer unRole
dans uneLocation
propriété deProfile
«2»? Je considère que de tels scénarios ne sont valables que pour les relations entre unOrganization
et unMember
Person
donc, qu'en pensez-vous?De la même manière, si
Organization
«1» est unMember
(ouFriend
) deOrganization
«2», est-il possible pourOrganization
«1» de réaliser unRole
dans uneLocation
propriété deOrganization
«2»? Encore une fois, je pense que ce genre de scénarios ne sont valables que pour les relations entre unOrganization
et unMember
Person
, est-ce correct?À cet égard - pendant que j'écris ces questions - je pense qu'il serait raisonnable de dire qu'il n'y a que trois types de relations différentes impliquant
Organizations
etPersons
, et nous pouvons définir:Organization
et un enPerson
tant que «Membership
».Person
et un autre différentPerson
de «Friendhip
».Organization
et un autre différentOrganization
.Est-il possible pour un
Organization
d'être unFriend
(ou unMember
) d' un à plusieurs différentOrganizations
en même temps? Ou il est seulement possible pour unOrganization
d'avoir seulement une relation avec exclusivement un autreOrganization?
Modèle de données successives illustrant la première avancée
En tenant compte de vos réponses et résolutions aux aspects en suspens que j'ai énumérés ci-dessus, j'ai créé ce qui suit…
Bien que je ne me sente pas encore très à l'aise avec lui, ce nouveau modèle de données exprime les règles commerciales suivantes:
Profile
est soit un,Organization
soit unPerson
. [2]Profile
peut être l'ami offrant d' un à plusieursFriendProfiles
, et unProfile
peut être l'ami qui accepte d' un à plusieursFriendProfiles
. [3]Location
peut être composé d' un à plusieursLocations
. [4]Réponses à vos commentaires spécifiques ultérieurs
Oui, c'est une bonne comparaison, bien que je n'appellerais pas cela une séparation des préoccupations (qui est, certainement, un principe fondamental de la programmation et de la conception d'applications), car ce terme se rapporte généralement à la phase de développement d'applications et nous nous trouvons actuellement dans le stade de compréhension des données et de conception de leur structure logique.
D'après mon expérience personnelle, je considère que cette phase a à voir avec la mise des choses significatives dans leur contexte entier, elle a à voir avec les associations qui existent entre les différentes entités qui sont pertinentes dans le scénario d'intérêt particulier, puis illustrant ces éléments dans un modèle de données. Dans le cas spécifique sur lequel vous commentez, l'
Address
entité peut avoir différents types de connexions avec d'autres entités, une avecProfile
et une autre avecLocation
.Et, oui, quand quelque chose ne se sent pas bien ou naturel , cela peut bien être un signe qu'il faut faire plus d'efforts pour comprendre les données pertinentes. De cette manière, l'
Address
entité est l'une des choses que je considère comme nécessitant plus d'attention, car je pense que la relation entre unProfile
et unAddress
pourrait être gérée au moyen de l'Location
entité (du fait que chacunLocation
doit avoir au moins un physiqueAddress
), nous pourrions donc rejeter l'ProfileAddress
entité associative représentée dans le dernier modèle, mais vous devez continuer à analyser ces points et me faire part de vos idées.Oui, c'est une remarque très intelligente de votre part, car IDEF1X recommande l'utilisation de noms de rôles pour dénommer les CLÉS ÉTRANGÈRES, afin de saisir la signification de ces attributs en fonction de l'entité dans laquelle ils sont utilisés. Il convient également de noter que cela est également fortement lié au concept de migration des clés primaires . En fait, l'utilisation des noms de rôle précède IDEF1X, car il a été initialement présenté par le Dr EF Codd dans son texte fondateur de 1970. De cette manière, on peut clairement voir la fidélité que la norme IDEF1X garde envers le modèle relationnel .
Outre les détails déjà décrits ci-dessus à propos de l'
Address
entité, je ne sais pas si lesRoles
faits effectués par un donnéProfile
dans un particulierLocation
sont équivalents pour unOrganization
ou unPerson
. De mon point de vue, unPerson
premier doit être associé à unOrganization
, et ensuite ceOrganization
serait nomméPerson
pour effectuer unRole
dans un particulierLocation
, mais vous connaissez mieux le scénario, donc ces règles peuvent être inutiles. À cet égard, je vais insister sur le fait qu'il serait très utile pour moi de savoir la description contextuelle ou sens que les futurs utilisateurs de cette structure de données donnent àOrganization
,Profile
etLocation
, mais je comprends que cela peut être considéré comme une information confidentielle, ce serait donc une limitation.Avec la structure actuelle, il semble que tout le monde (
Organization
ouPerson
) peut être lié à n'importe qui (encore une fois,Organization
ouPerson
) et peut être / faire n'importe quoi (Role
) n'importe où (Location
) mais, perharps, c'est précisément ce que vous et les utilisateurs attendez de cette base de données , pour lesquels vous fournirez bien entendu des contraintes bien définies. Si tel est le cas, nous fournissons presque une solution finale. Puisque, naturellement, votre opinion est décisive dans cette situation, vous devez également analyser ces idées et me faire part de vos conclusions afin que nous puissions prendre les dernières mesures.Deuxième avance réalisable
Malheureusement, la communication s'est arrêtée il y a quelques semaines, je suppose à cause des engagements de travail que vous devez respecter, ce qui est tout à fait raisonnable. J'aurais été beaucoup plus content si nous avions développé un modèle plus stable et robuste mais, en raison de nos interactions précédentes, je peux supposer que j'ai pu vous orienter dans la bonne direction.
En plus de ce qui a déjà été présenté dans ce processus de questions et réponses, je considère que fournir une nouvelle progression à partir des modèles de données précédents peut être utile pour d'autres chercheurs ayant un problème similaire. J'ai donc créé le…
Modèle de données préliminaire des organisations et des profils - Deuxième avancée
Comme on peut le voir dans un tel modèle de données, j'ai supprimé la relation plusieurs-à-plusieurs que j'ai décrite dans les modèles précédents entre
Profile
etAddress
, car une donnéeProfile
est déjà liée à un-à-plusieursAddresses
via sa propriétéLocations
.Un autre changement qui est illustré dans cette nouvelle avancée est le fait qu'elle inclut désormais la possibilité qu'une donnée
Location
puisse appartenir à un à plusieursProfiles
. Par conséquent, j'ai changé laLocation
CLÉ PRIMAIRE (en supprimant l'LocationOwnerProfileId
attribut), puis ajouté une entité associative ( plusieurs à plusieurs ) qui se rapporteProfile
àLocation
.Remarques
1. IDEF1X est une technique de modélisation de données hautement recommandable qui a été définie comme norme en décembre 1993 par le National Institute of Standards and Technology ( NIST ) des États-Unis .
2. Il s'agit d'une occurrence d'un cluster (super) type-sous-type . Au cas où vous seriez intéressé, voici une réponse dans laquelle je traite de manière plus détaillée ce type de relations.
3. Un exemple d'une relation hiérarchique plusieurs-à-plusieurs , et est très similaire à la structure qui a donné une solution définitive au «problème d'explosion des pièces» . Une telle solution a bien sûr été introduite par le Dr Edgar Frank Codd dans son article de 1970 extrêmement influent «Un modèle relationnel de données pour les grandes banques de données partagées» .
4. En tant que tel, il s'agit d'un exemple de relation hiérarchique un-à-plusieurs (ou plusieurs-à-un) .
la source
Je pense que vous essayez de mélanger les concepts de la modélisation d'objets et les concepts de la modélisation des données d'une manière qui ne vous aide pas à clarifier votre propre compréhension du problème. J'espère que je pourrai effacer un peu l'encombrement sans trop de bavardage.
Le modèle relationnel, en tant que tel, ne prend pas en charge l'héritage, sans parler du polymorphisme. Cela signifie qu'un modèle de conception plutôt spécialisé doit être utilisé lors de la modélisation d'une situation réelle qui est facilement gérée par l'héritage et le polymorphisme dans un modèle d'objet. Plus d'informations sur ce modèle de conception spécial plus tard.
Lorsque le modèle ER a été développé pour la première fois, il était censé être une alternative indépendante de la mise en œuvre à la modélisation relationnelle. Au début, il n'avait rien d'héritage non plus. Mais dans le courant des années 1980 ou 1990, le modèle a été étendu pour fournir certaines des mêmes capacités expressives que celles que vous obtenez avec l'héritage. Ce modèle était connu sous le nom de «modèle ER étendu», mais à toutes fins pratiques, le modèle ER d'aujourd'hui comprend des fonctionnalités EER.
Une fonction EER porte le nom de "généralisation / spécialisation". Vous pouvez rechercher et lire ce concept sur le Web. Gen-spec fournit à peu près la même capacité d'expression que les classes et les sous-classes fournissent dans un modèle d'objet. Cependant, Gen-spec ne traite pas les problèmes liés à la conception de tables relationnelles pour une situation de type gen-spec. Plus sur cela plus tard.
Dans la modélisation ER, une relation implique toujours les mêmes entités. Par conséquent, la relation d'ami entre une organisation et un profil n'est pas la même chose que la relation d'ami entre un profil et un autre profil. Les deux relations ont besoin de noms différents. Vous allez simplement vous nouer si vous ne suivez pas cette règle.
Soit cela, soit vous devez trouver une entité généralisée dont les organisations, les profils et éventuellement les emplacements sont tous des spécialisations. Je ne comprends pas assez bien votre cas pour vous aider.
En passant, je remarque que vous combinez votre modèle relationnel et votre modèle ER en un seul modèle. La plupart des architectes de bases de données chevronnés le font. Mais je vous conseille de garder les deux modèles séparés (bien que réconciliés l'un avec l'autre) jusqu'à ce que vous ayez acquis des compétences.
Enfin, comment conçoit-on des tables relationnelles qui représentent une situation gen-spec? Essayez de rechercher ces deux modèles de conception "Class-table-inheritance" et "Single-Table-Inheritance". Il y a deux balises pour celles-ci dans Stackoverflow. Il existe également de très bonnes présentations des modèles sur le Web. J'aime particulièrement le traitement de Martin Fowler. Il semble savoir comment pensent les modélisateurs d'objets. J'espère que cela t'aides.
la source