É ó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 Profileatualmente é entendido como sinônimo Person.
- An
Organizationé amigo de um para muitos Profiles .
- An
Organizationé amigo de um para muitos Organizations .
- An
Organizationé membro de um para muitos Organizations .
- A
Profileé um membro de um para muitosOrganizations .
- A
Profileé amigo de um para muitos Profiles .
- A
Profileé um membro de um para muitos Profiles .
Locais e endereços
- Um
Organizationé dono de um para muitos Locations .
- A
Locationé classificado por um para muitos LocationTypes ( apenas um em um determinado momento).
- Um
Locationpode ter um-para-muitos Addresses ( um Physical , um para Shipping, um para Billing, ou um que serve a propósitos todos disseram, ou um que combina dois propósitos e outra que serve apenas um deles).
Um Addresspode ser mantido por um para muitos Profiles ou, em outras palavras, um Profilemantém um para muitos Addresses .
Um específico Addresspode ser utilizado por um-para-muitos Profiles (servindo como Physicalpara um Profile , a ser utilizado para Billingpor um diferente , etc.). Então, um Addressfunciona de maneira semelhante para Locationse Profiles.
- Assim, um indivíduo
Addresspode ser, ao mesmo tempo , de tipo Physical, Shipping e Billing .
Locais e funções
- A
Locationabre um para muitos Roles .
- A
Rolepode ser realizado em um para muitos Locations .
- A
Profile(uma vez definido como Memberum Organization) pode executar um para muitos Roles , em um para muitos Locations (mas apenas um específico Roleem cada Locationum em um momento específico, ou seja, nunca dois ou mais Roles 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 Profileem seu contexto tenha um significado semelhante (ou o mesmo) ao de Person, mas poderia ser um pouco diferente. Dessa forma, você diria que, no seu cenário, as entidades Organizatione Personsão subtipos de Profile?
Pode um Profile(ou Person) possuir um para muitos EmailAddresses , ou é Profile(ou Person) fixo para exatamente um EmailAddress ?
Deseja fornecer a possibilidade de um Organizationcontato ser contatado por meio de Telephonee Email, ou você deseja restringir isso para apenas Profile(ou Person)?
Eu suponho que a Locationseja fixo exatamente para umAddress do tipo Physical, isso está correto?
É possível que um Locationseja compartilhado por um para muitos diferentes Organizations ou , caso contrário, um Locationpossa pertencer a apenas um Organization ?
Você declarou por meio de comentários que o fato de ser a Membere a Friendé 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 entre Organizatione Profile(ou Person) 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:
- Suponho que a declaração
an Organization is a Member of another Organizationtenha efeitos diferentes dos da declaração a Profile (or Person) is a Member of an Organizationchamada entidade Location.
- Como você pode ver no modelo de dados, acho que o
Rolede Owneré válido apenas para um Organizatione, para mim, o válido Rolespara um Profile(ou Person), dentro de um Locationare Admine Member. 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(ou Person) jogar diferente Rolesdentro do mesmo Location? ou seja, pode Personser, ao mesmo tempo, o Admine também um Memberdo mesmo Location? Quais são as regras nesse sentido?
Eu acho que o mesmo Profile(ou Person) pode jogar diferente Rolesem diferente Locations. Por exemplo: Um específico Profile(ou Person) é o "Admin" em Location"1" e o mesmo Profile(ou Person) é um " Member" em Location"2", ao mesmo tempo. Estou certo?
É possível que um particular Locationtenha diferentes LocationTypesao mesmo tempo, ou um indivíduo está Locationfixo para manter exatamente um LocationType?
O atributo Organization.Websiterepresenta o endereço do site de uma organização específica, como "dba.stackexchange.com"?
Se Profile"1" (entendido como Person) é um Member(ou Friend) de Profile"2", é possível que Profile"1" execute um Roleem uma Locationpropriedade de Profile"2"? Considero que esses cenários são válidos apenas para os relacionamentos entre um Organizatione um Member Personentão, o que você acha?
De maneira semelhante, se Organization"1" é um Member(ou Friend) de Organization"2", é possível para Organization"1" executar um Roleem uma Locationpropriedade de Organization"2"? Mais uma vez, acho que esse tipo de cenário é válido apenas para os relacionamentos entre an Organizatione a Member 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 Organizationse Persons, e podemos definir:
- (a) A relação entre an
Organizatione a Personcomo “ Membership”.
- (b) A relação entre um
Persone outro diferente Personcomo “ Friendhip”.
- (c) Ainda precisamos encontrar um nome significativo para descrever o relacionamento entre um indivíduo
Organizatione outro diferente Organization.
- Então, deixe-me saber o que você pensa sobre (a), (b) e (c).
É possível para um Organizationser um Friend(ou uma Member) de um-para-muitos diferentes Organizationsao mesmo tempo? Ou só é possível para um Organizationter 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:
- Um
Profileé qualquer um Organization ou uma Person. [2]
- A
Profilepode ser o amigo que oferece de um para muitos FriendProfiles e a Profilepode ser o amigo que aceita de um para muitos FriendProfiles . [3]
- A
Locationpode consistir em um para muitos Locations . [4]
Respostas aos seus comentários específicos subsequentes
É realmente interessante observar / agravar a separação de preocupações [por exemplo, LocationAddress e ProfileAddress] - porque eu obviamente queria me apressar e manter todas elas sem as relações corretas [engraçado, engraçado, não parecia certo com o meu ERD original].
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 Addressentidade pode ter diferentes tipos de conexões com outras entidades, uma com Profilee outra com Location.
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 Addressentidade é uma das coisas que considero que precisam de mais atenção, pois acho que o relacionamento entre a Profilee a Address poderia ser tratado por meio da Locationentidade (devido ao fato de que todos Locationdevem ter pelo menos um físico Address), portanto, poderíamos descartar a ProfileAddressentidade associativa descrita no modelo mais recente, mas você deve continuar analisando esses pontos e me informar suas idéias.
Além disso, é prática comum no IDEF1X alterar negações de PK / FK em entidades para melhor legibilidade [por exemplo, ProfileId - LocationOwnerProfileId]?
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 .
Eu ficaria intrigado em aprender o que você não gosta particularmente / sente que não modela, com / na solução?
Além dos detalhes já descritos acima sobre a Addressentidade, não tenho certeza se os Rolesrealizados por um dado Profileem particular Locationsão equivalentes a um Organizationou a um Person. Na minha perspectiva, um Personprimeiro precisa estar associado a um Organizatione, em seguida, isso Organizationindicaria Personexecutar um Roleem um particular Location, 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 a Organization, Profilee,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 ( Organizationou Person) pode estar relacionado a qualquer pessoa (de novo Organizationou Person) 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 Profilee Address, uma vez que um dado Profilejá está relacionado a um-para-muitos Addresses por meio de sua propriedade Locations.
Outra mudança ilustrada neste novo avanço é o fato de agora incluir a possibilidade de que um dado Locationpossa pertencer a um para muitos Profiles . Conseqüentemente, alterei a LocationPRIMARY KEY (descartando o LocationOwnerProfileIdatributo) e, em seguida, adicionei uma entidade associativa ( muitos para muitos ) relacionada Profilea ele Location.
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) .