Estou criando um diagrama conceitual [sim, eu sei que incluí atributos e chaves - mas é apenas para consolidar o que estou fazendo enquanto aprendo] - então, por favor, trate-o como conceitual, com foco em Relacionamentos e tabelas e não como diagrama;)
Minha dificuldade é: estou tentando descobrir a melhor maneira de modelar os relacionamentos de Perfil, Local e Organização.
Primeiro de tudo, REGRAS:
- Um ou mais perfis podem ser membros / amigos de uma ou mais organizações ; e vice versa.
- Um ou mais perfis podem ser membros / amigos de outros perfis.
- Uma ou mais organizações podem ser membros / amigos de outras organizações.
Amigo e Membro diferem, pois os Amigos são como somente leitura e os Membros [dependendo do nível] têm acesso total para alterar as coisas.
Para complicar ainda mais as coisas, os Locais têm seu próprio conjunto de regras refináveis "adicionais". Por exemplo, uma Organização possui dois Locais , mas, dependendo das regras de Localização, um Membro [ Perfil ] dessa Organização pode ter acesso total em um Local, mas acesso restrito ao Local. de outros. [Desculpe: você provavelmente precisará abrir a imagem em outra janela para obter um melhor tamanho de visualização.]
Então, como você pode ver, o conceito de Perfis e Organizações é o mesmo, assim como o conceito ainda não modelado de Amigos e Membros [...] que eu imagino que será tratado da mesma forma que as tabelas intermediárias atuais, com a configuração Proprietário / Admin / Membro / Amigo etc. no registro]. Por isso, por que estou pensando no seguinte conceito:
Consulte a Opção 2 na imagem acima: que removeria as tabelas Organização e Organização_Locations atuais e seus relacionamentos, substituindo-a pela Tabela Organização da Opção 2 como um relacionamento um tanto recursivo com o Perfil .
Suponho que o cerne da questão é se eu estou sendo muito programado com o polimorfismo em detrimento da simplicidade e flexibilidade, confundindo-me inteiramente no processo;)
Obrigado por seus pensamentos antecipadamente, muito apreciado - M :).
Diagrama revisado:
Em resposta às perguntas da MDCCL:
- Sim, o perfil é constituído por uma pessoa e tem o mesmo significado - embora a sua lógica seja direcionada - acredito que você esteja correto: organização e pessoa podem ser subtipos de perfil ; portanto, um perfil é composto de uma pessoa ou uma organização.
- Um endereço de email por perfil.
- Sim. Como acima, a organização deve ter pelo menos um endereço de email.
- Correto, um endereço fixo.
- É uma possibilidade, mas uma raridade - embora, pelo que estou aprendendo -, devamos, portanto, modelá-lo para longevidade futura etc., e apenas para confirmar, um Local pode ser possuído por mais de uma Pessoa.
A localização é definitivamente a entidade integral entre a maioria dos outros. Talvez eu esclareça o que pode ser feito de forma sucinta aqui, e deixe que você leia minhas outras respostas que, esperamos, pertencem a adições benéficas a essa pergunta primeiro [ depois veja minha resposta ao nº 6 no final ];) Re: O Dono da Função.
An **Organization** can be an Owner of zero or more **Locations**.
A Person can be an owner of zero of more Locations
[portanto, como você supôs anteriormente; Simplificando, um perfil pode ser o proprietário de zero ou mais locais.Sim, um perfil que é proprietário de um local assume todas as permissões de função [superusuário]; um perfil que seja um administrador pode alterar determinados detalhes do local , mas principalmente ajuda / edita os detalhes / dados fornecidos por todos os outros perfis - este será fornecido principalmente pelo (s) membro (s) básico (s) dos locais ; que deixa o Membro básico , que pode ler somente todos os detalhes do local relacionados e fornecer dados que devem ser examinados por um administrador / proprietário . Além disso, qualquer perfil[Organização / Pessoa] é muito parecido com um Membro Básico 'somente leitura' - vamos chamá-lo de Convidado - mas apenas se o Local estiver definido como Público [e não Privado ], embora eles não possam fornecer informações como um Membro Básico pode .
- Corrigir.
- Sua intuição é incrível! Sim,
it is foreseen that a single Location could contain one to many LocationTypes
- para complicar ainda mais as coisas - prevê-se que esses LocationTypes individuais possam ter permissões variáveis para perfis associados ao local 'pai'; dos quais, as permissões seriam filtradas do Local para o LocationType / s [muito parecido com as permissões de segurança da pasta do SO]. Observo através do seu diagrama que você pode estar se referindo ao tipo mais como uma descrição? - Sim.
- Veja 12.
- Correto, a capacidade do Perfil1 [Pessoa ou Organização] para atuar nos Locais pertencentes ao Perfil2 [Pessoa ou Organização] [se forem Amigos / Membros com permissões corretas] é fundamental.
- Muito razoável - a) concordo. b) concordo. c) Sim, hmm? ... Talvez seja o mesmo que Perfil [pessoa] para Perfil [pessoa] = Amigos . Qualquer que seja a descrição, ela giraria em torno da Localização , pois a Organização atuaria sobre outras Localização da Organização ; embora semanticamente, duvido que qualquer organização queira parecer subserviente como um "membro" da organização desse local para poder fazê-lo, "não importa quão boa seja a causa".
[6] Isso ainda é um pouco cinza para mim, mas aqui vai ... Para meu possível prejuízo, a semelhança entre as relações Membro / Amigo é tão próxima que pensei em combiná-las; Em retrospecto, com seu diagrama e interpretação, parece que você pode estar certo em mantê-los separados [ eu diferenciaria o relacionamento único por meio da propriedade enum: Proprietário / Administrador / Membro / Amigo ]. Seu conceito como, por exemplo: Um local que é propriedade de uma organização terá de zero a muitos perfis [pessoa ou organização], mas deve haver uma clara diferença entre como os perfis atuam no local por meio de sua relação [membro ou amigo ] denotado por meio de funções.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.
fonte
Respostas:
É ótimo que você dedique algum tempo para entender, classificar e modelar os dados com os quais está lidando, pois, a partir de minha experiência pessoal, tudo isso torna todo o processo de desenvolvimento mais fácil e flexível para futuras mudanças. E tenho certeza de que você também já está ciente disso.
Modelo de dados preliminar e regras de negócios assumidas
Definei uma lista de regras de negócios que assumi após ler sua pergunta e examinar atentamente seus diagramas, a fim de descrever minha compreensão de suas especificações. Depois de definir essa lista, derivei um modelo de dados IDEF1X [1] que decidi enviar como documento .PDF em uma plataforma externa (Dropbox), pois, devido ao seu formato, esse modelo de dados não se encaixa bem em uma imagem incorporada. Esses dois instrumentos serão úteis como referência para alguns pontos importantes que enumero abaixo na seção intitulada Aspectos a serem resolvidos, a fim de seguir adiante .
Primeiro, aqui está o…
Como é apenas isso, preliminar, considere-o como um meio para nos ajudar a alcançar o modelo de dados final desejado.
Regras de negócios assumidas
O referido modelo de dados preliminar foi derivado de uma coleção de regras de negócios (inferidas da sua pergunta) que enumerarei da seguinte maneira:
Organizações e perfis
Observe que
Profile
atualmente é entendido como sinônimoPerson
.Organization
é amigo de um para muitosProfiles
.Organization
é amigo de um para muitosOrganizations
.Organization
é membro de um para muitosOrganizations
.Profile
é um membro de um para muitosOrganizations
.Profile
é amigo de um para muitosProfiles
.Profile
é um membro de um para muitosProfiles
.Locais e endereços
Organization
é dono de um para muitosLocations
.Location
é classificado por um para muitosLocationTypes
( apenas um em um determinado momento).Location
pode ter um-para-muitosAddresses
( umPhysical
, um paraShipping
, um paraBilling
, ou um que serve a propósitos todos disseram, ou um que combina dois propósitos e outra que serve apenas um deles).Um
Address
pode ser mantido por um para muitosProfiles
ou, em outras palavras, umProfile
mantém um para muitosAddresses
.Um específico
Address
pode ser utilizado por um-para-muitosProfiles
(servindo comoPhysical
para umProfile
, a ser utilizado paraBilling
por um diferente , etc.). Então, umAddress
funciona de maneira semelhante paraLocations
eProfiles
.Address
pode ser, ao mesmo tempo , de tipoPhysical
,Shipping
eBilling
.Locais e funções
Location
abre um para muitosRoles
.Role
pode ser realizado em um para muitosLocations
.Profile
(uma vez definido comoMember
umOrganization
) pode executar um para muitosRoles
, em um para muitosLocations
(mas apenas um específicoRole
em cadaLocation
um em um momento específico, ou seja, nunca dois ou maisRoles
ao mesmo tempo) )Aspectos a serem resolvidos para seguir em frente
Para continuar avançando na resolução do seu modelo de dados, aqui está uma lista de pontos relevantes que, uma vez elaborados, ajudarão a alcançar esse objetivo:
Supus que o termo
Profile
em seu contexto tenha um significado semelhante (ou o mesmo) ao dePerson
, mas poderia ser um pouco diferente. Dessa forma, você diria que, no seu cenário, as entidadesOrganization
ePerson
são subtipos deProfile
?Pode um
Profile
(ouPerson
) possuir um para muitosEmailAddresses
, ou éProfile
(ouPerson
) fixo para exatamente umEmailAddress
?Deseja fornecer a possibilidade de um
Organization
contato ser contatado por meio deTelephone
eEmail
, ou você deseja restringir isso para apenasProfile
(ouPerson
)?Eu suponho que a
Location
seja fixo exatamente para umAddress
do tipoPhysical
, isso está correto?É possível que um
Location
seja compartilhado por um para muitos diferentesOrganizations
ou , caso contrário, umLocation
possa pertencer a apenas umOrganization
?Você declarou por meio de comentários que o fato de ser a
Member
e aFriend
é o mesmo. Como você pode ver no meu modelo de dados preliminares proposto, eu segui suas especificações originais e descrevi todas as combinações possíveis de associação e amizade entreOrganization
eProfile
(ouPerson
) em diferentes entidades, pois acho que isso pode ser útil no esforço de definir o melhor possível estrutura para essa parte do seu cenário. Neste sentido:an Organization is a Member of another Organization
tenha efeitos diferentes dos da declaraçãoa Profile (or Person) is a Member of an Organization
chamada entidadeLocation
.Role
deOwner
é válido apenas para umOrganization
e, para mim, o válidoRoles
para umProfile
(ouPerson
), dentro de umLocation
areAdmin
eMember
. O que você acha disso tudo? Como você está em contato direto com as regras de negócios que se aplicam à sua situação, é necessário me informar se minhas suposições estão corretas.Pode um
Profile
(ouPerson
) jogar diferenteRoles
dentro do mesmoLocation
? ou seja, podePerson
ser, ao mesmo tempo, oAdmin
e também umMember
do mesmoLocation
? Quais são as regras nesse sentido?Eu acho que o mesmo
Profile
(ouPerson
) pode jogar diferenteRoles
em diferenteLocations
. Por exemplo: Um específicoProfile
(ouPerson
) é o "Admin" emLocation
"1" e o mesmoProfile
(ouPerson
) é um "Member
" emLocation
"2", ao mesmo tempo. Estou certo?É possível que um particular
Location
tenha diferentesLocationTypes
ao mesmo tempo, ou um indivíduo estáLocation
fixo para manter exatamente umLocationType
?O atributo
Organization.Website
representa o endereço do site de uma organização específica, como "dba.stackexchange.com"?Se
Profile
"1" (entendido comoPerson
) é umMember
(ouFriend
) deProfile
"2", é possível queProfile
"1" execute umRole
em umaLocation
propriedade deProfile
"2"? Considero que esses cenários são válidos apenas para os relacionamentos entre umOrganization
e umMember
Person
então, o que você acha?De maneira semelhante, se
Organization
"1" é umMember
(ouFriend
) deOrganization
"2", é possível paraOrganization
"1" executar umRole
em umaLocation
propriedade deOrganization
"2"? Mais uma vez, acho que esse tipo de cenário é válido apenas para os relacionamentos entre anOrganization
e aMember
Person
, isso está correto?Nesse sentido, enquanto escrevo essas perguntas, acho que seria razoável dizer que existem apenas três tipos diferentes de relacionamentos envolvendo
Organizations
ePersons
, e podemos definir:Organization
e aPerson
como “Membership
”.Person
e outro diferentePerson
como “Friendhip
”.Organization
e outro diferenteOrganization
.É possível para um
Organization
ser umFriend
(ou umaMember
) de um-para-muitos diferentesOrganizations
ao mesmo tempo? Ou só é possível para umOrganization
ter apenas um relacionamento com exclusivamente um diferenteOrganization?
Modelo de dados sucessivo representando o primeiro avanço
Em atenção às suas respostas e resoluções aos aspectos pendentes listados acima, criei o seguinte…
Embora ainda não me sinta à vontade com ele, este novo modelo de dados expressa as seguintes regras de negócios:
Profile
é qualquer umOrganization
ou umaPerson
. [2]Profile
pode ser o amigo que oferece de um para muitosFriendProfiles
e aProfile
pode ser o amigo que aceita de um para muitosFriendProfiles
. [3]Location
pode consistir em um para muitosLocations
. [4]Respostas aos seus comentários específicos subsequentes
Sim, essa é uma boa comparação, embora eu não a chamasse de separação de preocupações (que é, certamente, um princípio fundamental na programação e design de aplicativos), uma vez que esse termo geralmente pertence ao estágio de desenvolvimento de aplicativos e atualmente nos encontramos no estágio de compreensão dos dados e design de sua estrutura lógica.
Pela minha experiência pessoal, considero que esta fase tem a ver com colocar as coisas significativas em todo o seu contexto, tem a ver com as associações existentes entre as diferentes entidades que são relevantes no cenário de interesse específico e, em seguida, descrevendo essas coisas em um modelo de dados. No caso específico sobre o qual você está comentando, a
Address
entidade pode ter diferentes tipos de conexões com outras entidades, uma comProfile
e outra comLocation
.E, sim, quando algo não parece certo ou natural , pode ser um sinal de que é preciso fazer mais esforço para entender os dados pertinentes. Dessa forma, a
Address
entidade é uma das coisas que considero que precisam de mais atenção, pois acho que o relacionamento entre aProfile
e aAddress
poderia ser tratado por meio daLocation
entidade (devido ao fato de que todosLocation
devem ter pelo menos um físicoAddress
), portanto, poderíamos descartar aProfileAddress
entidade associativa descrita no modelo mais recente, mas você deve continuar analisando esses pontos e me informar suas idéias.Sim, esse é um comentário muito inteligente, pois o IDEF1X recomenda o uso de nomes de funções para denominar ESTRANGEIRAS, a fim de capturar o significado de tais atributos de acordo com a entidade em que está sendo usado. Também é importante notar que isso também está fortemente relacionado ao conceito de migração de chaves primárias . De fato, o uso de nomes de funções precede o IDEF1X, pois foi originalmente apresentado pelo Dr. EF Codd em seu texto seminal de 1970. Dessa maneira, pode-se ver claramente a fidelidade que o padrão IDEF1X mantém em relação ao modelo relacional .
Além dos detalhes já descritos acima sobre a
Address
entidade, não tenho certeza se osRoles
realizados por um dadoProfile
em particularLocation
são equivalentes a umOrganization
ou a umPerson
. Na minha perspectiva, umPerson
primeiro precisa estar associado a umOrganization
e, em seguida, issoOrganization
indicariaPerson
executar umRole
em um particularLocation
, mas você conhece melhor o cenário, portanto essas regras podem ser desnecessárias. A este respeito, vou insistir sobre o fato de que seria muito útil para mim saber a descrição contextual ou significado que os futuros utilizadores desta estrutura de dados dar aOrganization
,Profile
e,Location
, mas entendo que isso pode ser considerado uma informação confidencial, portanto, isso seria uma limitação.Com a estrutura atual, parece que todo mundo (
Organization
ouPerson
) pode estar relacionado a qualquer pessoa (de novoOrganization
ouPerson
) e pode ser / fazer qualquer coisa (Role
) em qualquer lugar (Location
), mas, talvez, isso é exatamente o que você e os usuários estão esperando deste banco de dados , para o qual você fornecerá restrições bem definidas, é claro. Se for esse o caso, estamos quase fornecendo uma solução final. Como, naturalmente, sua opinião é decisiva nessa situação, você também deve analisar essas idéias e me informar suas conclusões para que possamos dar os passos finais.Segundo avanço viável
Infelizmente, a comunicação parou há algumas semanas, acho que por causa dos compromissos de trabalho que você deve cumprir, o que é completamente razoável. Eu teria ficado muito mais satisfeito se tivéssemos desenvolvido um modelo mais estável e robusto, mas, devido às nossas interações anteriores, posso assumir que fui capaz de apontá-lo na direção certa.
Além do que já foi apresentado neste processo de perguntas e respostas, considero que fornecer uma nova progressão a partir dos modelos de dados anteriores pode ser útil para outros buscadores com um problema semelhante. Então, eu criei o…
Modelo Preliminar de Dados para Organizações e Perfis - Segundo Avanço
Como pode ser visto em tal modelo de dados, removi o relacionamento muitos-para-muitos que descrevi nos modelos anteriores entre
Profile
eAddress
, uma vez que um dadoProfile
já está relacionado a um-para-muitosAddresses
por meio de sua propriedadeLocations
.Outra mudança ilustrada neste novo avanço é o fato de agora incluir a possibilidade de que um dado
Location
possa pertencer a um para muitosProfiles
. Conseqüentemente, alterei aLocation
PRIMARY KEY (descartando oLocationOwnerProfileId
atributo) e, em seguida, adicionei uma entidade associativa ( muitos para muitos ) relacionadaProfile
a eleLocation
.Notas
1. IDEF1X é uma técnica de modelagem de dados altamente recomendável que foi definida como padrão em dezembro de 1993 pelo Instituto Nacional de Padrões e Tecnologia dos EUA ( NIST ).
2. Esta é uma ocorrência de um cluster de (super) subtipo de tipo . Caso você esteja interessado, aqui está uma resposta na qual trato de maneira mais detalhada com esse tipo de relacionamento.
3. Um exemplo de um relacionamento hierárquico muitos para muitos e é muito semelhante à estrutura que deu uma solução definitiva para o “Problema de Exploração de Peças” . É claro que essa solução foi introduzida pelo Dr. Edgar Frank Codd em seu artigo de 1970 extremamente influente "Um modelo relacional de dados para grandes bancos de dados compartilhados" .
4. Como tal, esta é uma instância de um relacionamento hierárquico um para muitos (ou muitos para um) .
fonte
Eu acho que você está tentando combinar conceitos da modelagem de objetos e conceitos da modelagem de dados de uma maneira que não esteja ajudando a esclarecer sua própria compreensão do problema. Espero poder limpar a desordem um pouco sem muita divagação.
O modelo relacional, como tal, não suporta herança, não importa o polimorfismo. Isso significa que um padrão de design bastante especializado deve ser usado ao modelar uma situação da vida real que é facilmente manipulada por herança e polimorfismo em um modelo de objeto. Mais sobre esse padrão de design especial mais tarde.
Quando o modelo ER foi desenvolvido, ele deveria ser uma alternativa independente de implementação à modelagem relacional. A princípio, também não tinha nada parecido com herança. Mas, em algum momento das décadas de 1980 ou 1990, o modelo foi estendido para fornecer alguns dos mesmos recursos expressivos que você obtém com a herança. Isso era conhecido como "modelo de ER estendido", mas, para todos os efeitos práticos, o modelo de ER de hoje inclui recursos de EER.
Um recurso EER atende pelo nome "generalização / especialização". Você pode procurar e ler esse conceito na web. Gen-spec fornece praticamente a mesma capacidade expressiva que classes e subclasses fornecem em um modelo de objeto. No entanto, a especificação de geração não lida com os problemas que envolvem o design da tabela relacional para uma situação de especificação de geração. Mais sobre isso mais tarde.
Na modelagem de ER, um relacionamento sempre envolve as mesmas entidades. Portanto, o relacionamento de amizade entre uma organização e um perfil não é a mesma coisa que o relacionamento de amizade entre um perfil e outro perfil. Os dois relacionamentos precisam de nomes diferentes. Você se amarrará se não seguir esta regra.
Ou você precisa criar uma entidade generalizada da qual Organizações, Perfis e, possivelmente, Locais sejam todas especializações. Não entendo bem o seu caso para ajudá-lo com isso.
Seguindo em frente, percebo que você está combinando seu modelo relacional e seu modelo de ER juntos em um único modelo. Os arquitetos de banco de dados mais experientes fazem isso. Mas eu aconselho você a manter os dois modelos separados (embora reconciliados um com o outro) até obter a proficiência.
Por fim, como projetar tabelas relacionais que representam uma situação gen-spec? Tente procurar esses dois padrões de design "Herança de tabela de classe" e "Herança de tabela única". Existem duas tags para elas no Stackoverflow. Existem também algumas boas apresentações dos padrões na web. Eu particularmente gosto do tratamento de Martin Fowler. Ele parece saber como pensam os modeladores de objetos. Espero que isto ajude.
fonte